C Fork程序输出说明

时间:2016-09-18 06:03:28

标签: c unix buffer fork

我在C中有一个使用#include <sys/types.h> #include <unistd.h> #include <stdio.h> void doit(void) { pid_t pid; fork(); fork(); printf("Unix System Programming\n"); return; } int main(void) { doit(); printf("WTF\n"); exit(0); } 系统调用的程序:

Unix System Programming
WTF
Unix System Programming
Unix System Programming
Unix System Programming
WTF
WTF
WTF

现在,这个程序给了我8行输出。我认为那是因为两个叉子2 ^ 2 = 4次* 2打印声明= 8次。如果我错了,请纠正我并解释原因。

现在,问题是为什么每次运行都会得到不同的输出?假设我执行此代码:第一次获得输出

Unix System Programming
WTF
Unix System Programming
Unix System Programming
WTF
Unix System Programming
WTF
WTF

我第二次得到:

protected virtual void Dispose(bool disposing)
{
    if (!disposedValue)
    {
        if (disposing)
        {
            writerThread.RequestStop(); //tells the thread to stop
            writerThread.Join();
        }

        // I think is better here in case Dispose is never called ??
        // writerThread.RequestStop(); //tells the thread to stop
        // writerThread.Join();

        // free unmanaged resources 


        disposedValue = true;
    }
}

第三次又不同了。为什么会这样?我无能为力;请详细解释。

2 个答案:

答案 0 :(得分:3)

当您分叉新进程时,父进程和子进程同时运行。他们执行各自printf()语句的顺序是不可预测的 - 有时父母将首先打印,有时孩子会打印。

如果在输出中包含PID,您可能会更好地理解,因此您可以看到哪个进程正在打印每一行。所以改为:

printf("%d: Unix System Programming\n", getpid());

printf("%d: WTF\n", getpid());

您应该看到的是,每个流程在Unix System Programming之前打印WTF,但流程的顺序会混淆。

答案 1 :(得分:2)

您看到的输出来自不同的进程。一旦fork成功,您将获得不同的子进程(以及父进程)。由于它们来自不同的进程,因此无法保证何时一个进程轮到并执行。因此,不同流程的输出混合在一起,每次运行的顺序可能不同。

如果您想确保父进程和子进程按某种特定顺序运行,那么您必须同步它们,这通常比仅仅分叉要多得多。 (它可能需要等待操作或使用管道 - 取决于您想要的同步性质。)