我在理解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/

10-09 08:47