gpt4 book ai didi

c - 用于多个子部分加法的流程 API

转载 作者:行者123 更新时间:2023-11-30 14:46:32 25 4
gpt4 key购买 nike

我创建了一个程序,该程序创建 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() 完成的。

关于c - 用于多个子部分加法的流程 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52214067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com