gpt4 book ai didi

c - 如何将变量从子进程 fork() 传递到他的父进程 fork()

转载 作者:太空宇宙 更新时间:2023-11-04 13:01:00 33 4
gpt4 key购买 nike

下面的代码输出了一系列的过程,它到底做了什么:

                 _PARENT_
/ \
/ \
child_2 child_3
/ \ / \
/ \ / \
/ \ / \
g_child_4 g_child_5 g_child_6 g_child_7

这是输出:

Process Pid: 929 PPid: 928 (position: 2).
Process Pid: 930 PPid: 928 (position: 3).
Process Pid: 931 PPid: 929 (position: 4).
Process Pid: 932 PPid: 929 (position: 5).
Process Pid: 934 PPid: 930 (position: 7).
Process Pid: 933 PPid: 930 (position: 6).

我的问题是,如何让 grandchild_4 和 5 将它们的位置值传递给 child_2,然后 child_2 将其求和并传递给父级? grandchilds_6 和 grandchilds_6 和 7 将它们的位置值传递给 child_3 并将其求和以传递给父级也是一样的吗?

我想要得到的只是能够打印所有孙子的位置值的总和,所以在输出中我可以拥有:

Process Pid: 929 PPid: 928 (position: 2).
Process Pid: 930 PPid: 928 (position: 3).
Process Pid: 931 PPid: 929 (position: 4).
Process Pid: 932 PPid: 929 (position: 5).
Process Pid: 934 PPid: 930 (position: 7).
Process Pid: 933 PPid: 930 (position: 6).
Result 22.

注意:不能使用管道、FIFO 或映射。
这是我的代码:

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

/*
* NUMBER OF LEVELS TO BE CREATED
*/
#define NUM_LEVEL 2

/*
* Child launcher
*/
int launchChild(int nivel,int n){
//sleep(1);
if(nivel>0) printf("Process Pid: %d PPid: %d (position: %d).\n",getpid(),getppid(), n+1);

if(nivel<NUM_LEVEL){
pid_t process = fork();//Child or parent?

if(process!=0){// Parent
process=fork();//Child or parent?

if(process==0){//Child
launchChild(nivel+1,2*n+2);
wait(NULL);
}
}
else{//Child
launchChild(nivel+1,2*n+1);
}
wait(NULL);
}
}

/*
* Main function
*/
int main(void){
launchChild(0,0);
}

最佳答案

您正在寻找的一般术语是进程间通信。有很多方法可以做到这一点:共享内存、管道、FIFO 等等。

出于您的目的,我可能建议在共享内存中创建一个简单的数组(参见 shmget 的手册页)。每个进程都可以用它的位置填充数组中的特定位置,然后您可以使用 POSIX 信号量(参见 sem_waitsem_post)向父进程发出信号位置已经填满,父进程就可以访问这个数组,看看它的子进程占据了什么位置。

关于c - 如何将变量从子进程 fork() 传递到他的父进程 fork(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33878650/

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