c - 等待进程返回

标签 c process waitpid

考虑:

int main()
{
        if (fork() == 0){
            printf("a");
        }
        else{
            printf("b");
            waitpid(-1, NULL, 0);
        }
        printf("c");
        exit(0);
 }

(来自 Computer Systems,Bryant - O'Hallaron)。

我们被要求提供所有可能的输出序列。

我回答:acbc、abcc、bacc。 但是,与解决方案 (bcac) 相比,我缺少一个输出。我认为这个输出是不可能的,因为父进程在打印 c (waitpid) 之前等待其子进程返回。这不是真的吗?为什么?而且,在那种情况下,上面的代码与没有 waitpid 行的代码有什么区别?

最佳答案

我看不出 bcac 有任何可能。起初我预计会出现一些基于 stdio 缓冲区以意外顺序刷新的诡计。但即便如此:

child 在输出a 之前不会输出c。因此 bcac 中的第一个 c 一定来自父级。

waitpid 完成之前,父级不会输出 c。但这在子进程完成之前不会发生,包括在 exit() 期间发生的最终 stdio 刷新。因此第一个 c 总是来自 child 。

反证法已经实现...输出不能是bcac

好吧,您可以做一件事来打乱订单。您可以在一个已经有一个即将退出的子进程的进程中执行该程序。如果先前存在的 child 在新 child 打印a之前退出,那么主进程将检测到 that 退出并返回 waitpid,然后继续打印它的东西并可能在 child 打印任何东西之前退出。

这是在 setuid 程序中需要注意的事情:不要假设因为您的程序只创建一个子进程,所以它只有一个子进程。如果您处于高级防御代码学习环境中,那么这个答案是有道理的。在 unix 新手上下文中,它似乎不相关,最好只说 bcac 是不可能的,即使它在技术上是不正确的。

关于c - 等待进程返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25276597/

相关文章:

c - 尝试调用单独的函数时的未定义行为

c - 理解这个难题的解决方案

c - 如何使用环绕查找 C 中字符之间的距离

c - 提高并发进程的效率 - 设置 CPU 限制或其他?

c - 确定已终止进程的 pid

C: 当子进程断开连接时,fork() 通知父进程

c++ - 如何强制 avcodec 使用未对齐的帧数据平面?

c - tcgetsid 与 getsid 函数有何不同?

javascript - 通过 nodejs 重新附加到生成的进程

linux - Bash:WAITING超时