Para começar, observe que argv[0]
não é necessariamente o nome do programa. É o que o autor da chamada coloca em argv[0]
da chamada do sistema execve
(por exemplo, consulte esta questão no Stack Overflow ) . (Todas as outras variantes de exec
não são chamadas do sistema, mas interfaces para execve
.)
Suponha, por exemplo, o seguinte (usando execl
):
execl("/var/tmp/mybackdoor", "top", NULL);
/var/tmp/mybackdoor
é o que é executado, mas argv[0]
é definido como top
e é isso que ps
ou (real) top
exibiria. Consulte esta resposta em U & L SE para saber mais sobre isso.
Definindo tudo isso de lado: Antes do advento de sistemas de arquivos sofisticados como /proc
, argv[0]
era a única maneira de um processo aprender sobre seu próprio nome. Para que isso seria bom?
- Vários programas personalizam seu comportamento dependendo do nome pelo qual foram chamados (geralmente por links simbólicos ou físicos, por exemplo Utilitários do BusyBox ; vários outros exemplos são fornecidos em outras respostas a esta pergunta).
- Além disso, serviços, daemons e outros programas que fazem o log através do syslog geralmente prefixam seu nome às entradas de log; sem isso, o acompanhamento de eventos se tornaria quase inviável.