嗨我对for
以及它在i
循环中的行为方式有疑问。
所以跟我问:
创建一个父进程,创建10个子进程,每个进程在for循环中打印实际的int i;
for(i=0;i < 10;i++){
if(fork()==0){
print(i);
}
exit(0);
}
值。这段代码是否正确?
i
我的理解是,这段代码在每个循环迭代中创建一个父项和一个子项,其中父项直接终止,子项打印i
;
因此,为了让每个父母和10个孩子都打印exit(0)
,我应该像这样包裹int i;
int p;
for(i=0;i < 10;i++){
if((p=fork())==0){
print(i);
}
if(p > 0){
exit(0);
}
}
:
'academy' => [
'driver' => 'local',
'root' => storage_path('app/academy'),
],
有人可以确认或者这是否正确,或者帮助我更好地理解它是否错误。
谢谢:)
答案 0 :(得分:0)
fork()
调用不会创建一对新进程(父进程,子进程),但保留原始进程(父进程)并创建一个另一进程(子进程),因此它“返回”两次”。
在你的第一个片段中,你真的只有一个父母。唯一的问题是,它在第一次迭代时完成。 :)
看:i = 0
,现在我们只有父进程(称之为P
)。
P
输入fork()
并保留两次:P
(返回子项的PID)和新创建的子C0
(返回0)。然后,根据if
语句,C0
打印0
,P
不执行任何操作。然后执行路径收敛,P
和C0
都退出。现在我们根本没有我们的流程。
您的第二个片段循环体可以按如下方式重写:
p = fork();
if (p == 0) {
print(i);
}
if (p > 0) {
exit(0);
}
假设fork()
不会返回负数(错误),这两个if
实体实际上就像then
- else
分支一样。它们会导致子进程打印它的数字和旧的父进程退出,所以你得到了一个流程的瀑布,它们在一个序列中相互替换(大部分时间只作为一个孩子,然后作为父级)
你只需要重写它:
for(i = 0; i < 10; i++) {
p = fork();
if (p == 0) {
print(i);
exit(0);
}
// In fact, you should place waitpid(...) somewhere here,
// otherwise the child will become a so called zombie process
// after its termination.
// Only after parent termination they all will be
// finally recycled by init (PID 1) generally using up your system's
// resources for indefinite time
}
现在您有P
创建C0
。 C0
打印其编号并立即退出,而P
只是继续下一个循环迭代,创建C1
,就像C0
打印其编号并退出一样,依此类推。 AFAIK是最初要求的。
请注意,在现实生活中,您必须以某种方式处理-1
返回值,该值指示fork()
调用中的某些错误(所以实际上,在我重写的第二个片段中有一个<{1}}语句不会执行的可能性,为简单起见,我省略了它们。