我试图在不杀死父母/孩子的情况下创建完整的流程树。
到目前为止,我只能创建树的一面,然后它会杀死所有进程(从下到上)然后我创建树的另一面。
在流程结束和死亡之前,我需要做什么来创建整个树?
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <time.h>
int main(){
clock_t t;
double time_taken;
t = clock();
int status;
pid_t idProcesso; // P1
printf("I'm P1: %d | my dad: %d\n", getpid(), getppid());
idProcesso = fork();
switch(idProcesso){
case -1: exit(-1); //ERROR
case 0: //P2
printf("I'm P2: %d | my dad P1: %d\n", getpid(), getppid());
idProcesso = fork();
switch(idProcesso){
case -1: exit(-1); //Error
case 0: //P4
printf("I'm P4: %d | my dad P2: %d\n", getpid(), getppid());
break;
default: //Continue P2
wait(&status);
printf("I'm P2: %d | Already waited for my son P4: %d\n", getpid(), idProcesso);
idProcesso = fork(); //P5
switch(idProcesso){
case -1: exit(-1); //ERROR
case 0: //P5
printf("I'm P5: %d | my dad P2: %d\n", getpid(), getppid());
break;
default: //Continue P5
wait(&status); //P2 waits his son P5
printf("I'm P2: %d | Already waited for my son P5: %d\n", getpid(), idProcesso);
break;
}
}
break;
default: //Continue P1
wait(&status);
printf("I'm P1: %d | Already waited for my son P2: %d\n", getpid(), idProcesso);
idProcesso = fork(); //P1 creates son
switch(idProcesso){
case -1: exit(-1); //ERROR
case 0://P3
printf("I'm P3: %d | my dad P1: %d\n", getpid(), getppid());
idProcesso = fork(); //P3 creates son P6
switch(idProcesso){
case -1: exit(-1); //ERROR
case 0: //P6 son of P3
printf("I'm P6: %d | my dad P3: %d\n", getpid(), getppid());
break;
default: //Continue P3
wait(&status); //P3 waits his son P6
printf("I'm P3: %d | Already waited for my son P6: %d\n", getpid(), idProcesso);
idProcesso = fork(); //P3 creates son P7
switch(idProcesso){
case -1: exit(-1);//ERROR
case 0: //P7 son of P3
printf("I'm P7: %d | son of P3: %d\n", getpid(), getppid());
break;
default: //P3 waits son P7
wait(&status);
printf("I'm P3: %d | Already waited for my son P7: %d\n", getpid(), idProcesso);
break;
}
break;
}
break;
default: //Continue P1
wait(&status); // P1 waits his son P3
printf("I'm P1 again, my id: %d\n", getpid());
t = clock() - t;
time_taken = ( (double)t ) / CLOCKS_PER_SEC;
printf("Time used in seconds: %f\n", time_taken);
}
break;
} //SWITCH
} //Main
我需要做这样的事情:
我目前的代码发生了什么:
P1 - &gt; P2 - &gt; P4 - &gt;杀死P4 - &gt; P5 - &gt; KILL P5 - &gt; KILL P2
P3 - &gt; P6 - &gt; KILL P6 - &gt; P7 - &gt; KILL P7 - &gt; KILL P3 - &gt;杀死P1
我需要让他们所有人活着#39;同时,jusst然后我杀了所有。
答案 0 :(得分:0)
你可以使用信号。你必须保存P4的id,在P4执行printf之后你调用pause()
。然后为P5和P6做。当您创建最后一个,在本例中为P7时,树已完成,您向使用kill()
暂停的进程发送信号,使它们结束执行。