Pro účely experimentování jsem vytvořil binární soubor, který vypíše $PATH
a volá which
takto:
#include <stdlib.h>
#include <stdio.h>
int main() {
char *path = getenv("PATH");
if (path)
printf("got a path: %s\n", path);
else
printf("got no path\n");
system("which which");
return 0;
}
když jej spustím v prázdném prostředí přes
env -i ./printpath
Dostávám následující výtisk:
got no path
/usr/bin/which
Moje otázka zní:proč je správný which
binárně volané, i když neexistuje $PATH
?
Přijatá odpověď:
Použili jste system
funkce, takže ke spuštění příkazu which
použije jiný shell . Z man system
:
DESCRIPTION
system() executes a command specified in command by calling /bin/sh -c
command, and returns after the command has been completed. During exe‐
cution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT
will be ignored.
Pokud změníte which which
příkaz k echo $PATH
:
$ env -i ./a.out
got no path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Pokud změníte kód tak, aby používal execve
místo system
, dostanete očekávaný výstup:
#include <stdlib.h>
#include <stdio.h>
int main() {
char *path = getenv("PATH");
if (path)
printf("got a path: %s\n", path);
else
printf("got no path\n");
execve("echo $PATH");
return 0;
}
Zkompilujte a spusťte jej:
$ gcc test.c && env -i ./a.out
got no path
Hrozná situace – souborové systémy připojené současně několika nezávislými instancemi OS?
Pomocí obrazovky Gnu dostanu nezpracovanou výzvu se zpětnými lomítky?