For 循环中的 fork()
fork() in a For Loop
#include <stdio.h>
#include <sys/type.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
int main(void)
{
pid_t pid;
int i;
for(i=0; i<3; i++) {
pid = fork();
if(pid == -1) {
printf("Fork Error.\n");
} else if(pid == 0) {
printf("I am child");
}
}
if(pid != 0) {
while((pid = waitpid(-1, NULL, 0)) > 0)
if(errno == ECHILD)
break;
printf("I am parent and all children have exited.\n");
}
exit(0);
return 0;
}
结果是,
'I am child' 打印了 7 次,
'I am parent and all children have exited.' 打印了 4 次
而且打印顺序不固定
这是我的问题!
为什么'I am child'打印了7次,
和 'I am parent and all children have exited.' 打印了 4 次 ?
我不明白这些句子被打印了多少次。
能详细解释一下吗?
您可以试试下面的代码。您需要添加等待 header。同时,在提供了child个进程的0条件后,一定要注销,否则代码中各个进程每次都会fork一次又一次。很快你必须在任务结束后杀死每个进程。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>
int main(void){
pid_t pid;
int i;
for (i = 0; i < 3; i++)
{
pid = fork();
if (pid == -1) {
printf("Fork Error.\n");
} else if (pid == 0) {
printf("I am child\n");
exit(0); // !
}
}
if (pid != 0) {
while ((pid = waitpid(-1, NULL, 0)) > 0)
if (errno == ECHILD)
break;
printf("I am parent and all children have exited.\n");
}
return 0;
}
#include <stdio.h>
#include <sys/type.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
int main(void)
{
pid_t pid;
int i;
for(i=0; i<3; i++) {
pid = fork();
if(pid == -1) {
printf("Fork Error.\n");
} else if(pid == 0) {
printf("I am child");
}
}
if(pid != 0) {
while((pid = waitpid(-1, NULL, 0)) > 0)
if(errno == ECHILD)
break;
printf("I am parent and all children have exited.\n");
}
exit(0);
return 0;
}
结果是,
'I am child' 打印了 7 次, 'I am parent and all children have exited.' 打印了 4 次
而且打印顺序不固定
这是我的问题!
为什么'I am child'打印了7次,
和 'I am parent and all children have exited.' 打印了 4 次 ?
我不明白这些句子被打印了多少次。
能详细解释一下吗?
您可以试试下面的代码。您需要添加等待 header。同时,在提供了child个进程的0条件后,一定要注销,否则代码中各个进程每次都会fork一次又一次。很快你必须在任务结束后杀死每个进程。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>
int main(void){
pid_t pid;
int i;
for (i = 0; i < 3; i++)
{
pid = fork();
if (pid == -1) {
printf("Fork Error.\n");
} else if (pid == 0) {
printf("I am child\n");
exit(0); // !
}
}
if (pid != 0) {
while ((pid = waitpid(-1, NULL, 0)) > 0)
if (errno == ECHILD)
break;
printf("I am parent and all children have exited.\n");
}
return 0;
}