我在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;
}
}
第三次又不同了。为什么会这样?我无能为力;请详细解释。
答案 0 :(得分:3)
当您分叉新进程时,父进程和子进程同时运行。他们执行各自printf()
语句的顺序是不可预测的 - 有时父母将首先打印,有时孩子会打印。
如果在输出中包含PID,您可能会更好地理解,因此您可以看到哪个进程正在打印每一行。所以改为:
printf("%d: Unix System Programming\n", getpid());
和
printf("%d: WTF\n", getpid());
您应该看到的是,每个流程在Unix System Programming
之前打印WTF
,但流程的顺序会混淆。
答案 1 :(得分:2)
您看到的输出来自不同的进程。一旦fork
成功,您将获得不同的子进程(以及父进程)。由于它们来自不同的进程,因此无法保证何时一个进程轮到并执行。因此,不同流程的输出混合在一起,每次运行的顺序可能不同。
如果您想确保父进程和子进程按某种特定顺序运行,那么您必须同步它们,这通常比仅仅分叉要多得多。 (它可能需要等待操作或使用管道 - 取决于您想要的同步性质。)