让一个过程等待它的兄弟'流程

时间:2016-04-29 01:31:08

标签: c unix process signals parent-child

我试图在不杀死父母/孩子的情况下创建完整的流程树。

到目前为止,我只能创建树的一面,然后它会杀死所有进程(从下到上)然后我创建树的另一面。

在流程结束和死亡之前,我需要做什么来创建整个树?

我的代码一次创建每一面###

 #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

我需要做这样的事情:

enter image description here

我目前的代码发生了什么:

  

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然后我杀了所有。

1 个答案:

答案 0 :(得分:0)

你可以使用信号。你必须保存P4的id,在P4执行printf之后你调用pause()。然后为P5和P6做。当您创建最后一个,在本例中为P7时,树已完成,您向使用kill()暂停的进程发送信号,使它们结束执行。