我正在尝试用exec()和fork()做一个简单的例子。但我有一点问题,我不明白如何解决它。
代码执行3个分叉,并且在每个子代中它调用一个exec。第一个系统调用是“who”,在“cd”之后,和“ls -ls”。我的问题是:在制作“cd”后,“ls”调用不显示当前目录中的文件。所以,如果我有'dir1 / dir2',我会做“cd”,但当我做“ls”时,程序会显示'dir / dir2'中的文件。
一个孩子可能会访问另一个孩子所做的更改吗?
while (cont_arg < 3) {
pid_t pid = fork();
if (pid == -1) {
perror("fork failed");
exit(EXIT_FAILURE);
} else if (pid == 0) {
printf("\n---: child process ID -> %d.\n", getpid());
printf("command --- > %s\n", command[cont_arg]);
execlp(command[cont_arg], command[cont_arg], arg[cont_arg], NULL);
_exit(EXIT_SUCCESS);
} else {
wait(&status);
}
cont_arg++;
}
答案 0 :(得分:2)
第一个系统调用是&#34;谁&#34;
不,那些不是系统调用。术语&#34;系统调用&#34;用于完全不同的东西。 who
和ls
是您使用exec执行的程序。另一方面,cd
是一个shell命令。所以执行cd
,即使你正确地执行它也不会有任何影响。因为cd
只是告诉shell进程改变其内部状态,只有shell及其子进程可见。
很遗憾,您没有看到cd
的执行官失败,因为您没有检查execlp
的错误。检查exec的返回值并处理这些错误,事情将变得更加清晰。
答案 1 :(得分:2)
你不能使用/usr/local/bin/php /home/username/public_html/cron.php
来运行命令execlp
,这是一个shell内置命令,如果你在Linux上,你应该调用cd
来改变当前的工作目录你的过程。
chdir
同时检查int chdir(const char *path);
的返回值:
execlp