gpt4 book ai didi

c - 如何更改流程创建的顺序?

转载 作者:行者123 更新时间:2023-12-03 10:01:11 25 4
gpt4 key购买 nike

我必须像下面这张图那样制作一棵进程树:enter image description here

我设法创建了这样一棵树,但是差别很小。 P4实际上是P3,而P3是P4。我已经按顺序创建了它们,因为我无法想到将P4附加到P1,将P3附加到P2的方法。到目前为止,这是我写的:

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

int main(int argc, char **argv){

printf("Main pid is %d\n", getpid());

pid_t pid1[2];
pid_t pid2[4];
pid_t pid3a, pid3b;

//FIRST LAYER
for(int i = 0; i < 2; i++){
pid1[i] = fork();

if(pid1[i] == 0){
printf("[son] pid %d from [parent] pid %d\n", getpid(), getppid());

//SECOND LAYER
if ( i == 0){
for(int j = 0; j < 4; j++){
pid2[j] = fork();

if (pid2[j] == 0){
printf("\t[son] pid %d from [parent] pid %d\n", getpid(), getppid());

//THIRD LAYER
if (j == 1){
pid3a = fork();

if (pid3a == 0){
printf("\t\t[son] pid %d from [parent] pid %d\n", getpid(), getppid());
exit(0);
}

waitpid(pid3a, NULL, 0);
}


if (j == 2){
pid3b = fork();

if (pid3b == 0){
printf("\t\t[son] pid %d from [parent] pid %d\n", getpid(), getppid());
exit(0);
}

waitpid(pid3b, NULL, 0);
}
//END THIRD LAYER


exit(0);
}
}
//END SECOND LAYER

for(int j = 0; j < 4; j++)
waitpid(pid2[j], NULL, 0);
}


exit(0);
}
}

for(int i = 0; i < 2; i++)
waitpid(pid1[i], NULL, 0);
//END FIRST LAYER

return 0;
}

为了实现这一目标,我可以改变什么?

最佳答案

最好让fork比所需路径少一倍。根据图表查看以下代码(未切换P3和P4)

void doP1(){
if(fork())
doP2();
else
doP4();
}

void doP2(){
if(fork())
doP3();
else if(fork())
doP5();
else if(fork())
doP6();
else
doP7();
}

void doP3(){
return;
}

void doP4(){
return;
}

void doP5(){
doP8();
}

void doP6(){
doP9();
}

void doP7(){
return;
}

void doP8(){
return;
}

void doP9(){
return;
}

int main(){
doP1();
}

我将树的每个节点都分成了自己的函数,除了按图所示的方式进行 fork 外,它什么也不做。

当数据路径拆分为两个时,您无需创建两个子线程,而只需创建一个。 parent 走一条路, child 走另一条路。

即,P1只能调用fork一次,P2只能调用fork三次,P5和P6根本不能调用fork

我希望能回答您的问题!

关于c - 如何更改流程创建的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61428725/

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