多个子项的处理API部分添加

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多个子项的处理API部分添加相关的知识,希望对你有一定的参考价值。

我创建了一个程序,它创建了3个子节点并将一个数组发送给每个子节点,然后每个子节点计算数组的总和并将其与进程ID一起打印,然后将总和发送给父节点,父节点又将添加值并打印最后的总和。我的问题是当我去运行我的代码时,我会在子部分求和和父求和之后得到随机的子和父输出。

这是我的代码:

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

int main ()
{
  pid_t child_pid[3] ;
  //Define the array to hold the set of numbers
  int setNum[6] = {2,3,7,-1,10,6}, sum[3] = {0, 0, 0}, j;

  //Display the parents process ID
  printf("I am the parent with process ID: %d \n", (int) getppid());

  //Create a process
  for(j=0; j<3; j++)
  {
    child_pid[j] = fork();
  }
  j=0;
  if (child_pid[0] != 0)
  {
    //calculate the sum
    for(int i=0; i<2; i++)
      sum[j] = sum[j] + setNum[i];
    printf("I am the child with process ID: %d and I am sending %d to my parent\n", child_pid[0], sum[j]);
    j=j+1;
  }
  if (child_pid[1] != 0)
  {
    //calculate the sum
    for(int i=2; i<4; i++)
      sum[j] = sum[j] + setNum[i];
    printf("I am the child with process ID: %d and I am sending %d to my parent\n", child_pid[1], sum[j]);
    j=j+1;
  }
  if (child_pid[2] != 0)
  {
    //calculate the sum
    for(int i=4; i<6; i++)
      sum[j] = sum[j] + setNum[i];
    printf("I am the child with process ID: %d and I am sending %d to my parent\n", child_pid[2], sum[j]);
    j=j+1;
  }


  //Print the parent with final sum
  int final_sum = sum[0] + sum[1] +sum[2];

  printf("I am the parent with process ID: %d with a final sum of %d\n", (int) getppid(), final_sum);

  return 0;
}
答案

几个问题。

  • 你的初始fork()循环将导致创建7个后代进程,而不是你想要的3个进程。如果fork()返回0,那么您将处于子进程中,并且不应该进一步fork()。
  • 一旦进程fork(),默认情况下,它不再与其父进程共享任何内存。您需要设置用于保持共享的内存位(例如使用带有MAP_SHARED|MAP_ANONYMOUS的mmap),或者通过管道或套接字或其他方式传回结果。
  • 你对child_pid元素的测试是0倒退。除了正确的过程之外,您在每个进程中运行子逻辑。
  • 您的子进程都打印只有父进程应该打印的结束文本。
  • 您正在使用getppid(),它获取父PID,但您的代码表明您正在尝试获取进程自己的PID,这是由getpid()完成的。

以上是关于多个子项的处理API部分添加的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将多个片段添加到片段过渡?

是否有在单个活动中处理多个片段的 Android 设计模式?

使用 Composition API 在 Vue 中处理子项和父项中的提交事件

我无法使用多个按钮将子项添加到 ListView

Play Framework:在没有子项目的情况下拆分多个文件中的路径

如何在地图片段 API v2 布局顶部添加按钮