execve(path, argv, envp)
execve — это системный вызов ядра Linux. execve – это системный вызов, вызывается из C-кода, через glibc, внутри бинарников.
Формальная сигнатура (из C):
int execve(
const char *path,
char *const argv[],
char *const envp[]
);
Когда я пишу в shell:
firefox
execve("/usr/lib/firefox/firefox", argv, envp);
Если программа запускается вот так:
execve("/usr/lib/firefox/firefox", ["/usr/lib/firefox/firefox"], envp);
... то процесс будет отображаться как /usr/lib/firefox/firefox.
А если вот так:
execve("/usr/lib/firefox/firefox", ["firefox"], envp);
... то процесс будет отображаться как firefox.
Если запустить вот так:
execve("/bin/sleep", ["firefox", "9999"], envp);
... то процесс в ps будет отображаться как firefox 9999, хотя реально исполняется /bin/sleep.
У execve три параметра:
"/usr/lib/firefox/firefox"
Файл, который реально запускается
argv[0] = "/usr/lib/firefox/firefox";
argv[1] = "-contentproc";
argv[2] = "...";
argv[3] = NULL;
Аргументы программы
PATH=/usr/bin:/bin
HOME=/home/mark
DISPLAY=:0
WAYLAND_DISPLAY=wayland-1
Переменные окружения процесса
передать в argv[0] laja:
exec -a laja /usr/bin/thunar
Теперь проверяем процесс:
ps aux | grep "laja"
# mark 418054 1.9 0.3 1839244 60444 pts/2 Ssl+ 23:38 0:00 laja
# mark 418795 0.0 0.0 6648 4288 pts/6 S+ 23:39 0:00 grep --color=auto laja
То есть у нас теперь запущен /usr/bin/thunar, но в ps он отображается как laja.