调用fork()时,子进程执行代码的哪一部分? #包括 #包括 #包括 #包括 int main(){ int-pid; int-pids[3]; 智力状态; int numprocesses=0; int-total_进程=3; while(numprocesses
我的期望是“检查”字符串应该从父进程和子进程中打印出来。但“检查”字符串只打印一次 这是否意味着子进程只执行if(pid==0){..}中的代码 这是否意味着子进程将只执行调用fork()时,子进程执行代码的哪一部分? #包括 #包括 #包括 #包括 int main(){ int-pid; int-pids[3]; 智力状态; int numprocesses=0; int-total_进程=3; while(numprocesses,c,operating-system,fork,C,Operating System,Fork,我的期望是“检查”字符串应该从父进程和子进程中打印出来。但“检查”字符串只打印一次 这是否意味着子进程只执行if(pid==0){..}中的代码 这是否意味着子进程将只执行if(pid==0){..}中的代码 对。在该块的末尾有一个return语句。孩子在那一点离开了 这是否意味着只有if(pid==0){..}中存在的代码将被删除 由子进程执行 是的。成功时,子进程的PID在父进程中返回,0在子进程中返回。失败时,在父进程中返回-1,不创建子进程,并设置errno以指示错误 您的代码检查0(父
if(pid==0){..}
中的代码
对。在该块的末尾有一个return
语句。孩子在那一点离开了
这是否意味着只有if(pid==0){..}中存在的代码将被删除
由子进程执行
是的。成功时,子进程的PID在父进程中返回,0在子进程中返回。失败时,在父进程中返回-1,不创建子进程,并设置errno以指示错误
您的代码检查0(父进程),但不检查-1(错误)。它应该
我的期望是“检查”字符串应该从父进程和子进程中打印出来。但“检查”字符串只打印一次
您发布的代码具有以下特定于子级的代码:
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main() {
int pid;
int pids[3];
int status;
int numprocesses = 0;
int total_processes = 3;
while (numprocesses < total_processes) {
pid = fork();
// Child process
if (pid == 0) {
printf("In child process: process id is %d\n", getpid());
sleep(5);
return 4;
} else {
pids[numprocesses] = pid;
numprocesses++;
printf("In parent process: created process number: %d\n", pid);
}
}
printf("Checking\n");
// Waiting for 3rd child process
waitpid(pids[total_processes - 1], &status, 0);
if (WIFEXITED(status) != 0) {
printf("process %d exited normally\n", pids[total_processes - 1]);
printf("exit status from child is %d\n", WEXITSTATUS(status));
} else {
printf("process %d not exited normally\n", pids[total_processes - 1]);
}
return 0;
}
最后的返回4代码>语句使子项从main()
返回,并且在循环期间不执行之后的部分
事实上,这可以让你免于。。。也就是说,你单亲父母的所有孩子都做了一个return4你的父母应该尽可能多地调用wait()
来等待所有的孩子。如果有任何子项退出了循环,因为它们没有执行任何fork()
所以,问题是唯一脱离循环的进程是在循环中创建的所有子进程的父进程。因此,只需要一个检查,因为只有一个进程执行它
If,而不是返回4代码>你应该有中断编码>循环,然后您应该为每个子级设置一个检查
,错误调用等待
,为父级设置一个,只通知一个子级(哪一个是不可预测的,最有可能是第一个退出的子级(2)
s)
// Child process
if (pid == 0) {
printf("In child process: process id is %d\n", getpid());
sleep(5);
return 4;
} else {
...