Então, aqui temos que passar o nome do arquivo duas vezes na função
Eles não são exatamente a mesma coisa que você observa, observando que um deles é usado como argv[0]
valor. Isso não precisa ser o mesmo que o nome base do executável; muitas / a maioria das coisas o ignoram e você pode colocar o que quiser lá.
O primeiro é o caminho real para o executável, para o qual existe uma necessidade óbvia. O segundo é passado para o processo ostensivamente como o nome usado para invocá-lo, mas, por exemplo:
execl("/bin/ls", "banana", "-l", NULL);
Funcionará bem, presumindo que /bin/ls
seja o caminho correto.
Alguns aplicativos, no entanto, fazem uso argv[0]
. Normalmente, eles têm um ou mais links simbólicos $PATH
; isso é comum nos utilitários de compactação (às vezes eles usam invólucros de shell). Se você xz
instalou, stat $(which xzcat)
mostra que é um link para xz
e man xzcat
é o mesmo man xz
que explica "xzcat é equivalente a xz --decompress --stdout". A maneira como o xz pode dizer como foi invocada é verificando argv[0]
, tornando estes equivalentes:
execl("/bin/xz", "xzcat", "somefile.xz", NULL);
execl("/bin/xz", "xz", "--decompress", "--stdout", "somefile.xz", NULL);
busybox
pode ser o que você quer, dependendo de como você chama isso certo?