当 fork() 被调用时,子进程执行了哪部分代码?

问题描述

#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;
}

我的期望是应该从父进程和子进程打印“检查”字符串。但是 'Checking' 字符串只打印一次。

这是否意味着只有 if (pid == 0) {..} 中的代码会被子进程执行?

解决方法

这是否意味着只有 '\0' 中的代码会被子进程执行?

是的。该块的末尾有一个 $ ./bin/strinori Digite o que vai ser convertido: My Dog Has Fleas! String modificada: MY DOG HAS FLEAS! 语句。孩子在那个时候退出。

,

这是否意味着只有 if (pid == 0) {..} 中的代码才会是 由子进程执行?

是的,是的。成功时,父进程返回子进程的PID,子进程返回0。失败时,在父进程中返回 -1,不创建子进程,并设置 errno 以指示错误。

您的代码检查 0(父进程)而不是 -1(错误)。应该...

,

我的期望是应该从父进程和子进程打印“检查”字符串。但是 'Checking' 字符串只打印一次。

您发布的代码包含此子特定代码:

      // Child process
      if (pid == 0) {
         printf("In child process: process id is %d\n",getpid());
         sleep(5);
         return 4;
      } else {
      ...

和最后的 return 4; 语句使子进程从 main() 返回并且不在 while 循环之后执行部分。

这确实使您免于某些事情......也就是说,您单亲父母的所有孩子都进行了 return 4; 并且您的父母应该执行尽可能多的 wait() 调用以等待所有孩子.如果有任何孩子退出循环,因为他们没有创建 fork(),他们将从 wait 返回并返回一个错误 (errno == ECHILD),表明没有创建任何孩子,并且等待。

所以,唯一退出循环的进程是在循环中创建的所有子进程的父进程。所以应该只有一个 Checking,因为只有一个进程执行它。

如果不是 return 4; 你应该有 break; 循环,那么你应该有一个 Checking 每个孩子,错误地调用 wait,还有一个父母,只有一个孩子被通知(哪个是不可预测的,很可能是第一个exit(2)