Os aplicativos podem (e) reescrever seus argumentos de linha de comando após terem sido iniciados. Às vezes isso é feito por motivos de segurança, às vezes para facilitar a apresentação. IIRC, mysql
ou algum outro comando DB removeria senhas dadas como argumentos da lista de argumentos.
Não tenho certeza do método normalmente usado para isso, mas uma maneira é reexecutar com novos argumentos:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *args[], char *env[])
{
char *argv[] = {"bar: accepting", "blah", NULL};
if (argc == 1)
{
int fd = open("/proc/self/exe", O_RDONLY);
fexecve(fd, argv, env);
}
else
sleep(100);
}
Teste:
$ make foo
cc foo.c -o foo
$ ./foo & pgrep -fa bar
[1] 18047
18047 bar: accepting blah
Observe os PIDs.
Para ver o atual executável sendo usado, verifique /proc/<PID>/exe
:
$ ./foo & ls -l /proc/$!/exe
[1] 18025
3
lrwxrwxrwx 1 muru muru 0 Jan 7 00:59 /proc/18025/exe -> /home/muru/foo