fork() 执行不同的进程

Fork() to performe different processes

我正在尝试使用多个 fork() 调用来创建多个具有不同任务的 children 我找到了一个代码 Multiple child process

与我想要的非常接近,但我无法完全理解它

pid_t firstChild, secondChild;
firstChild = fork();
if(firstChild != 0)
{
  // In parent
  secondChild = fork();
  if(secondChild != 0)
  {
    // In parent
  }
  else
  {
    // In secondChild
  }
}
else
{
  // In firstChild
}

我的问题是:

firstChild = fork();
if(firstChild != 0)
{
    // In parent
    secondChild = fork();
    if(secondChild != 0)
    {
        // In parent
    }

“//in parent”是否表示它们是相同的进程(当我尝试测试时它们具有相同的 PID)。

谢谢(如果我没有完全理解 Fork 的概念,请随时告诉我)

How many process have been created (I assume that we have 4 since it's 2 forks!)?

根据您的 forks 结果,它应该是 0 到 2。如果没有出错,可能是 2。有一个父进程分叉 2 个子进程。

Does "//in parent" mean both of them are the same process (they have the same PID when I tried to test it).

是的。在您的情况下,代码正在检查 fork 的 return 值是否为非零。这不是一个好主意,因为它涵盖了 2 个不同的案例:

  • 它可能小于零表示错误,或者...
  • 它可能大于零,向父级指示新生成的进程的 pid 无论如何......考虑到一切顺利并且两个叉子都成功了,你最终会得到一个有 2 个不同子进程的父进程。

How can I create 3 children using 2 forks?( I can draw the tree that ends with 4 leaves 3 of them are children and 1 parent

像这样应该可以解决问题:

firstChild = fork();
if (firstChild < 0) {
    exit(EXIT_FAILURE);
    perror("fork");
}
secondChild = fork();

请注意,通过不再检查 fork() 的 return 值,我让子进程继续在与父进程相同的位置执行。所以下一个 fork 实际上将由父进程和子进程执行,每个子进程都产生一个新进程。所以我会得到这样的东西...

parent─┬─child1───(child1's child)
       └─child2

不过我想不出有什么办法只用 2 个叉子就可以得到这个:

parent─┬─child1
       ├─child3
       └─child2

注意:在 Whosebug 上,每个主题只限制自己回答一个问题。

下面的代码展示了如何创建 4 个进程 (1 parent 3 children) 只有 2 个 fork

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int *list;

void calculate_average(int );
void calculate_maximum(int);
void calculate_minimum(int);

void calculate_average(int count) 
{
        int i, total = 0;


        for (i = 0; i < count; i++)
                total += list[i];

        double average = total / count;
        
 printf("average is %f\n",average);

}

void calculate_maximum(int count)
{
        int i;

        int maximum = list[0];

        for (i = 1; i < count; i++)
                if (list[i] > maximum)
                        maximum = list[i];

 printf("maximum is %d\n",maximum);
}

void calculate_minimum(int count)
{
        int i;

        int minimum = list[0];

        for (i = 1; i < count; i++)
                if (list[i] < minimum)
                        minimum = list[i];
 printf("minimum is %d\n",minimum);
}

int main(int argc, char *argv[])
{
 pid_t pid, pid1;

 int num_of_args = argc-1;
 int i;

 /* allocate memory to hold array of integers */
        list = malloc(sizeof(int)*num_of_args);

        for (i = 0; i < num_of_args; i++)
                list[i] = atoi(argv[i+1]);
        
 printf("The %d number of input ingeters are\n",num_of_args);
        for (i = 0; i < num_of_args; i++)
                printf("%d\n",list[i]);

 /* fork a child process */
 pid = fork();

 if (pid < 0) { /* error occurred */
  fprintf(stderr, "Fork Failed\n");
  return 1;
 }
 else if (pid == 0) { /* P2 */
  pid1=getppid();
  calculate_average(num_of_args);
 }

 else {   /* P1 */
  pid1=getpid();
  wait(NULL);
 }
 
  pid = fork();
 
 if (pid < 0) { /* error occurred */
  fprintf(stderr, "Fork Failed\n");
  return 1;
 }
 
 else if (pid == 0) { /* could be either P3 or P4 */
  if (getppid() == pid1) { /* P3 */
   calculate_minimum(num_of_args);
  } 

  else {  /* P4 */
   calculate_maximum(num_of_args);
  }
 }
 
 else { 
  wait(NULL);
 }
    
     return 0;
}

请注意,其中一个 children 将是 parent 的孙子