execv
e execl
fazem exatamente a mesma coisa, com a diferença que execl
é destinado ao uso quando você sabe antecipadamente o número de argumentos da linha de comando enquanto execv
permite que o número de argumentos seja determinado dinamicamente.
A função mais geral é execv
; execl
é uma espécie de abreviação quando o número de argumentos é conhecido e permite ao programador evitar a construção da matriz argv[]
.
De qualquer forma, para responder a pergunta conforme solicitado: você deve saber antecipadamente o número de argumentos máximo que será passado para o programa para ser exec
d. Se você sabe o número máximo de argumentos, então você pode preparar antecipadamente uma chamada para execl
desenrolando a matriz de argumentos.
Suponha que você tenha:
char * exec_argv [21];
char * exec_pathname;
As duas chamadas seguintes são equivalentes para qualquer conteúdo legal da matriz de argumentos exec_argv[]
:
execv (exec_pathname, exec_argv);
execl (exec_pathname,
exec_argv [0], exec_argv [1], exec_argv [2], exec_argv [3],
exec_argv [4], exec_argv [5], exec_argv [6], exec_argv [7],
exec_argv [8], exec_argv [9], exec_argv [10], exec_argv [11],
exec_argv [12], exec_argv [13], exec_argv [14], exec_argv [15],
exec_argv [16], exec_argv [17], exec_argv [18], exec_argv [19],
NULL
);
(O último argumento de execl
é NULL
em vez de exec_argv[20]
porque gcc
irá procurá-lo se invocado com -Wall
; já que deve ser um NULL
algures em exec_args[]
isto não introduz qualquer diferença nos efeitos das duas chamadas de função.)