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.