我试图用fork()
创建5个进程,进行一些测试以了解该功能。我做了:
int f0, f1, f2, f3, f4;
switch (f0 = fork()) {
case (0):
foo(f0);
exit(0);
case (-1):
printf("\nError!");
exit(-1);
default:
wait();
}
switch (f1 = fork()) {
case (0):
foo(f1);
exit(0);
case (-1):
printf("\nError!");
exit(-1);
default:
wait();
}
//...same for f2,f3,f4
我真的不了解这里的流程。发生了什么?流程真的创建了一个时间?每次我使用fork()时都会创建一个新进程,它从代码的开头开始作为父亲的副本?
另外,我的想法建议我可能会改为:
if (f0 = fork() != -1)
foo(f0);
else if (f1 = fork() != -1)
foo(f1);
...
但我真的不明白这些差异。
答案 0 :(得分:2)
每次我使用fork()时,都会创建一个新进程,它从代码的开头开始
不,父进程和子进程都从父进程停止的位置继续执行(但是从fork()
接收不同的返回值)。换句话说,它们都执行紧跟fork()
之后的语句。
关于你的其他建议:
if (f0 = fork() != -1)
foo(f0);
else if (f1 = fork() != -1)
foo(f1);
...
有两个问题:
if
语句只处理其中两种情况。wait()
,以便父级等待子级终止。你的版本没有这样做。答案 1 :(得分:1)
这段代码很麻烦:
if (f0 = fork() != -1)
foo(f0);
else if (f1 = fork() != -1)
foo(f1);
除了分叉问题之外,原因是因为operator precedence of C,它表示比较是在分配之前完成的,这意味着f0
,f1
等被分配了比较的值而不是新的进程ID。
您需要使用括号,如下所示:
if ((f0 = fork()) != -1)
foo(f0);
else if ((f1 = fork()) != -1)
foo(f1);