Как использовать wait (); в процессе, чтобы ждать, пока его дочерний процесс не будет выполнен первым - PullRequest
0 голосов
/ 16 мая 2019

каждая printf команда представляет процесс. p0 процесс должен ожидать выполнения процесса p2, в то время как p2 должен ожидать, что сначала будет выполнено как минимум 2 его дочерних элемента (p3,p4,p5):

```
    #include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h>
#include <sys/wait.h>
#define _POSIX_SOURCE
int main()
{
    int pid1, pid2, pid3, pid4, pid5;
    int i;
    int status;

    pid1=fork();

    if (pid1 != 0){
      wait(&status);
    printf("I'm the parent P0.PID=%d, PPID=%d.\n", getpid(), getppid());}
else{

     printf("I'm the child P1 my parent is P0. PID=%d, PPID=%d.\n", getpid(), getppid());


    pid2=fork();

    if (pid2!=0){

    printf("I'm the child P2 and parent to p3,p4,p5.PID=%d, PPID=%d.\n", getpid(), getppid());



    pid3=fork();
    if (pid3 == 0){
    printf("I'm the child P3.PID=%d, PPID=%d.\n", getpid(), getppid());
}
    else {

        pid4=fork();
        if(pid4 == 0)
        {
    printf("I'm the child P4.PID=%d, PPID=%d.\n", getpid(), getppid());
}  else{
            pid5 = fork();
            if(pid5 == 0)
        {
    printf("I'm the child P5.PID=%d, PPID=%d.\n", getpid(), getppid());
              }
           }
        }
     }
  }
    /*  
    if(getppid(&pid1)==getppid(&pid5)){

        execl("/bin/ps","ps","-f",(char *)NULL);
    }*/
return 0;
  }

              P0
           /      \  
         P1        P2
                 / | \
                P3 P4 P5

1 Ответ

0 голосов
/ 16 мая 2019

Во-первых, используйте заключенный в скобки блок для else, связанный с "if (pid4==0)", и обязательно вложите блок "if (pid5==0)" внутрь.Это дает вам лучшую внутреннюю согласованность, но, что более важно, позволяет избежать тестирования значения pid5 в процессе, который никогда не устанавливает его:

                else {
                    pid5=fork();
                    if (pid5==0){
                        printf("I'm the child P5.PID=%d, PPID=%d.\n", getpid(), getppid()); 
                    }
                }

Затем, если вы добавите блок else к этому внутреннемувложенный if, он будет введен только процессом 2. В таком блоке вы можете вставить два вызова в wait() для сбора двух дочерних элементов.

Обратите внимание также, что сразу после wait()if (pid!=0){ представляется неуместным.Он вызывается p0 в то время, когда p1 является единственным потомком, которого он разветвил.Поэтому p0 будет ждать p1 , в то время как ваше заявленное намерение - дождаться p2 , который еще не былраздвоенный в этот момент.Вы вообще не требовали ждать p1 .Ожидание p2 может идти в блоке else, связанном с if (pid2==0).

Однако следует также отметить, что, поскольку он хочет ожидать конкретно p2 , p0 должен избегать одурачивания в вероятном случае, если сначала он соберет p1 .Вы можете сделать это правильно, проверив возвращаемое значение wait() (которое при успехе является pid собранного ребенка), или вы можете использовать waitpid() вместо этого, чтобы специально ждать процесса p2 и нетдругой.

...