关于使用fork()在C中创建进程,这段代码会发生什么
我试图用关于使用fork()在C中创建进程,这段代码会发生什么,c,process,fork,C,Process,Fork,我试图用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):
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);
...
但我真的不明白其中的区别
每次我使用fork()时,都会创建一个新进程,它从代码的开头开始
否,父进程和子进程都从父进程停止的位置继续执行(但从fork()
接收不同的返回值)。换句话说,它们都执行紧跟在fork()
之后的语句
关于你的其他建议:
if (f0 = fork() != -1)
foo(f0);
else if (f1 = fork() != -1)
foo(f1);
...
有两个问题:
if
语句只处理其中两种情况wait()
,以便父级等待子级终止。你的版本没有做到这一点fork()
接收不同的返回值)。换句话说,它们都执行紧跟在fork()
之后的语句
关于你的其他建议:
if (f0 = fork() != -1)
foo(f0);
else if (f1 = fork() != -1)
foo(f1);
...
有两个问题:
if
语句只处理其中两种情况wait()
,以便父级等待子级终止。你的版本没有做到这一点fork()
接收不同的返回值)。换句话说,它们都执行紧跟在fork()
之后的语句
关于你的其他建议:
if (f0 = fork() != -1)
foo(f0);
else if (f1 = fork() != -1)
foo(f1);
...
有两个问题:
if
语句只处理其中两种情况wait()
,以便父级等待子级终止。你的版本没有做到这一点fork()
接收不同的返回值)。换句话说,它们都执行紧跟在fork()
之后的语句
关于你的其他建议:
if (f0 = fork() != -1)
foo(f0);
else if (f1 = fork() != -1)
foo(f1);
...
有两个问题:
if
语句只处理其中两种情况wait()
,以便父级等待子级终止。你的版本没有做到这一点这段代码很麻烦:
if (f0 = fork() != -1)
foo(f0);
else if (f1 = fork() != -1)
foo(f1);
原因(分叉问题除外)是因为,表示比较是在赋值之前完成的,这意味着f0
,f1
等被赋值为比较值,而不是新的进程id
您需要使用括号,如下所示:
if ((f0 = fork()) != -1)
foo(f0);
else if ((f1 = fork()) != -1)
foo(f1);
这段代码很麻烦:
if (f0 = fork() != -1)
foo(f0);
else if (f1 = fork() != -1)
foo(f1);
原因(分叉问题除外)是因为,表示比较是在赋值之前完成的,这意味着f0
,f1
等被赋值为比较值,而不是新的进程id
您需要使用括号,如下所示:
if ((f0 = fork()) != -1)
foo(f0);
else if ((f1 = fork()) != -1)
foo(f1);
这段代码很麻烦:
if (f0 = fork() != -1)
foo(f0);
else if (f1 = fork() != -1)
foo(f1);
原因(分叉问题除外)是因为,表示比较是在赋值之前完成的,这意味着f0
,f1
等被赋值为比较值,而不是新的进程id
您需要使用括号,如下所示:
if ((f0 = fork()) != -1)
foo(f0);
else if ((f1 = fork()) != -1)
foo(f1);
这段代码很麻烦:
if (f0 = fork() != -1)
foo(f0);
else if (f1 = fork() != -1)
foo(f1);
原因(分叉问题除外)是因为,表示比较是在赋值之前完成的,这意味着f0
,f1
等被赋值为比较值,而不是新的进程id
您需要使用括号,如下所示:
if ((f0 = fork()) != -1)
foo(f0);
else if ((f1 = fork()) != -1)
foo(f1);
谢谢。第一次使用交换机实现是否会产生一些问题?非常感谢。第一次使用交换机实现是否会产生一些问题?非常感谢。第一次使用交换机实现是否会产生一些问题?非常感谢。第一次使用交换机实现是否会产生一些问题?