Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果If语句在for循环中创建子进程,那么该循环是否不再执行?_C_For Loop_If Statement_Fork_Break - Fatal编程技术网

C 如果If语句在for循环中创建子进程,那么该循环是否不再执行?

C 如果If语句在for循环中创建子进程,那么该循环是否不再执行?,c,for-loop,if-statement,fork,break,C,For Loop,If Statement,Fork,Break,在返回0之前,我正在阅读教科书(哲学家进餐问题)和main方法中的一个代码示例;语句,下面是我包含的代码块。这个循环应该将每个哲学家创建为一个并发的分叉过程。这意味着每个哲学家都执行哲学家(i) 然而,由于在if语句之后紧接着一个中断,这难道不意味着只有第一个哲学家(i=0)被创建了吗 for (i = 0; i < N - 1; ++i) if (fork() == 0) break; philosopher(i) ; (i=0;i

在返回0之前,我正在阅读教科书(哲学家进餐问题)和main方法中的一个代码示例;语句,下面是我包含的代码块。这个循环应该将每个哲学家创建为一个并发的分叉过程。这意味着每个哲学家都执行哲学家(i)

然而,由于在if语句之后紧接着一个中断,这难道不意味着只有第一个哲学家(i=0)被创建了吗

for (i = 0; i < N - 1; ++i)
    if (fork() == 0) 
        break;
philosopher(i) ;
(i=0;i将调用它的进程“拆分”为两个独立的进程,第二个进程是第一个进程的子进程。在父进程(原始进程)中,它返回子进程的PID。在子进程中,
fork()
返回
0

因此,在您的示例中,循环只在子进程中中断,而在父进程中继续生成剩余的哲学家

循环执行
N-1
次,产生
N-1
子哲学家。完成循环后,父进程还调用
哲学家(i)
,运行
N
th和final哲学家

将调用它的进程“拆分”为两个独立进程,第二个进程是第一个进程的子进程。在父进程(原始进程)中,它返回子进程的PID。在子进程中,
fork()
返回
0

因此,在您的示例中,循环只在子进程中中断,而在父进程中继续生成剩余的哲学家

循环执行
N-1
次,产生
N-1
子哲学家。完成循环后,父进程还调用
哲学家(i)
,运行
N
th和final哲学家

fork()
返回两次:在具有非零值的父级中(成功时为正值pid或失败时为负值),在具有
pid==0的子级中(如果调用成功)。
if(fork()==0)
中断子循环中的循环,以便子循环继续执行
i(其中父级也将继续,但仅在所有循环迭代结束后)

换句话说,

for (i = 0; i < N - 1; ++i)
    if (fork() == 0) 
        break;
philosopher(i) ;
(i=0;i
尝试(
fork()
未针对故障进行检查)运行
哲学家(i)i=0到i==N-2(包括
子进程)中的code>in
i=0到i==N-2(包括
子进程),然后在父进程中使用
i==N-1
运行它。

fork()
返回两次:在具有非零值的父进程中(成功时为正值pid,或失败时为负值),在具有
pid==0的子进程中(如果调用成功)。
if(fork()==0)
中断子循环中的循环,以便子循环继续执行
i(其中父级也将继续,但仅在所有循环迭代结束后)

换句话说,

for (i = 0; i < N - 1; ++i)
    if (fork() == 0) 
        break;
philosopher(i) ;
(i=0;i

尝试(
fork()
未针对故障进行检查)运行
哲学家(i)i=0到i==N-2(包括子进程)中运行code>,然后在父进程中与
i==N-1
一起运行。

仅当fork()返回零时,它才会停止。。看看答案!它将返回子对象的PIDnormally@JeffUK是的,但只要成功创建子进程,它不总是返回0吗?@JeffUK:这不是完全不清楚的——这是有效的C,只是不好的形式,因为省略
{}
会导致混乱,并且在编辑、重新格式化代码等时经常会出现错误。(包括一些臭名昭著的漏洞利用。)只有当fork()返回零时,它才会停止。请看答案!它将返回子对象的PIDnormally@JeffUK是的,但只要子进程创建成功,它不总是返回0吗?@JeffUK:嗯,这不是完全不清楚——这是有效的C,只是因为省略了
{}而不是很好的形式
在编辑、重新格式化代码等(包括一些臭名昭著的漏洞)时会导致混乱,并且经常出现错误。那么,我们如何让所有5位哲学家都参与进来呢?@Y.J.-将N设置为4。循环将重复4次,每次生成一个子进程,该子进程将调用
哲学家(i)
。然后循环将退出,因为N将等于4,因此测试
i
将失败。然后父进程将调用
哲学家(i)
。哦,我以为fork()在第一次迭代时返回0并在那里中断。这是否意味着对fork()的前4次调用返回到父进程?@Y.J;父进程永远不会消失,并且由于
中断
fork()
只会在父进程中调用。多线程编程可能需要一些时间来解决:您必须记住变量的值(在本例中,不同线程中包含返回值
fork()
)的一种隐式变量是完全独立的。
fork()
“发生”在父进程和子进程中,父进程和子进程现在都是独立的,但它返回不同的值。@Linuxios不是真的,但它确实帮了我一点忙——我想在子进程中也会调用fork,导致子进程创建更多的子进程,除非我使用返回:)那么,我们如何获得所有5个哲学家?@Y.J.-通过将N设置为4。循环将重复4次,每次生成一个子进程,该子进程将调用
哲学家(i)
。然后循环将退出,因为N将等于4,因此测试
i
将失败。然后父进程将调用
哲学家(i)
。哦,我原以为fork()在第一次迭代时会返回0,然后在那里中断。这是否意味着对fork()的前4次调用会返回paren