调用fork()时,子进程执行代码的哪一部分? #包括 #包括 #包括 #包括 int main(){ int-pid; int-pids[3]; 智力状态; int numprocesses=0; int-total_进程=3; while(numprocesses

调用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){..}中的代码

这是否意味着子进程将只执行
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()
返回,并且在
循环期间不执行
之后的部分

事实上,这可以让你免于。。。也就是说,你单亲父母的所有孩子都做了一个
return4wait()
来等待所有的孩子。如果有任何子项退出了循环,因为它们没有执行任何
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 {
      ...