我在理解Linux中的fork()
时遇到了一些问题。
让我困惑的是,如果父进程分叉子进程,子进程调用execl()
并且
cc不返回,父进程在子进程上等待退出,系统会吗?
挂?
提前谢谢你的帮助。
下面是mdadm的一个代码示例。因此在execl()
之后的子进程中存在execl()
。
如果exit(1)
不返回,那么execl()
是否会执行?如果没有,父母会无限期地等待吗?我就在这里吗?
if (!check_env("MDADM_NO_SYSTEMCTL"))
switch(fork()) {
case 0:
/* FIXME yuk. CLOSE_EXEC?? */
skipped = 0;
for (i = 3; skipped < 20; i++)
if (close(i) < 0)
skipped++;
else
skipped = 0;
/* Don't want to see error messages from
* systemctl. If the service doesn't exist,
* we start mdmon ourselves.
*/
close(2);
open("/dev/null", O_WRONLY);
snprintf(pathbuf, sizeof(pathbuf), "mdmon@%s.service",
devnm);
status = execl("/usr/bin/systemctl", "systemctl",
"start",
pathbuf, NULL);
status = execl("/bin/systemctl", "systemctl", "start",
pathbuf, NULL);
exit(1);
case -1: pr_err("cannot run mdmon. "
"Array remains readonly\n");
return -1;
default: /* parent - good */
pid = wait(&status);
if (pid >= 0 && status == 0)
return 0;
}
最佳答案
如果exec
不返回,则表示进程正在执行某些(新)代码。新代码完全替换了旧代码,因此从成功的exec
返回是毫无意义的,因为对exec
的调用在旧代码中。
在此期间,父进程将在其子进程的执行结束时wait
。所以父节点将被阻塞,直到子节点终止。
关于c - 在Linux中 fork ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21725909/