2016-04-29 2 views
1

Я хотел бы знать, есть ли способ приостановить процесс, но продолжить программу.Как приостановить процесс и продолжить программу?

Мне нужно создать процессы, как это:
enter image description here

Но когда я ударил P4 заканчивается, умирает, а затем P2 создает P5. Тогда P2 Dies и P1 создают P3, и там происходит то же самое.

Мне нужно создать все «дерево», прежде чем процессы начнут умирать.
Нельзя использовать wait или waitpid(), потому что он нацелен только на сына.

Есть ли способ сделать паузу P4 и продолжить от ее отца?
Если я не могу, как я могу достичь своей цели?

Мои в настоящее время код: Это создает в таком порядке:

P1 -> P2 -> Р4 -> Р4 ШТАМПЫ -> Р5 -> Р5 ШТАМПЫ -> P2 ШТАМПЫ -> P3 -> P6 - > P6 ШТАМПЫ -> P7 -> P7 ШТАМПЫ -> P3 ШТАМПЫ -> P1 СКОНЧАЛСЯ

#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, pai; 
    printf("P1 created: %d\n", getpid()); 

    idProcesso = fork(); 
    switch(idProcesso) 
    { 
     case -1: exit(1); 

     case 0: //P2 
      printf("P2 created: %d - son of P1: %d\n", getpid(), getppid()); 
      idProcesso = fork(); 
      switch(idProcesso) 
      { 
       case -1: exit(1); 

       case 0: //P4 
        printf("P4 created: %d - son of P2: %d\n", getpid(), getppid()); 
        sleep(1); 
        break; 
       default://P2 
        idProcesso = fork(); 
        switch(idProcesso) 
        { 
         case -1: exit(1); 

         case 0://P5 
          printf("P5 created: %d - son of P2: %d\n", getpid(), getppid()); 

          break; 
         default://P2 
          sleep(1); 
          break; 
        } 

        break; 
      } 
      break; 
     default: 

      idProcesso = fork(); 
      switch(idProcesso) 
      { 
       case -1: exit(1); 

       case 0://P3 
        printf("P3 created: %d - son of P1: %d\n", getpid(), getppid()); 
        idProcesso = fork(); 
        switch(idProcesso) 
        { 
         case -1: exit(1); 

         case 0://P6 
          printf("P6 created: %d - son of P3: %d\n", getpid(), getppid()); 
          sleep(1); 
          break; 
         default://P3 
          idProcesso = fork(); 
          switch(idProcesso) 
          { 
           case -1: exit(1); 

           case 0://P7 
            printf("P7 created: %d - son of P3: %d\n", getpid(), getppid()); 
            break; 
           default://P3 

            break; 
          } 
          sleep(1); 
         break; 
        } 
        break; 

       default: 
        sleep(4); 
        break; 
      } 
      break; 
    } 



    printf("Process id: %d terminated\n", getpid()); 
    exit(0); 
} 
+0

В недавнем Linux вы можете переименовать процессы: http://stackoverflow.com/questions/6476452/process-re-parenting-controlling-who-is-the-new-parent –

+0

вам нужно иметь все 7 процессов одновременно работать или строить дерево поочередно, когда корни/ветви отмирают, когда вы идете? p7 должен быть последним процессом? –

+0

И почему вы не можете использовать некоторые обычные механизмы синхронизации? Как трубы. –

ответ

1

процессы работают независимо друг от друга, так что вам нужно:

  1. Держите свои процессы в процессе жизни достаточно долго, чтобы все ваши процессы были созданы, что достаточно просто, используя sleep(); и

  2. Не начинайте wait() для любого из ваших дочерних процессов, пока вы их не создали.

Вот пример:

#define _POSIX_C_SOURCE 200809L 

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

int main(void) 
{ 
    pid_t pids[8] = {0}; 
    printf("P1 created (%lu).\n", (unsigned long) getpid()); 

    for (size_t i = 1; i < 3; ++i) { 
     pids[i] = fork(); 

     if (pids[i] == -1) { 
      perror("fork() error"); 
      exit(EXIT_FAILURE); 
     } 
     else if (pids[i] == 0) { 
      printf("P%zu created (%lu).\n", i + 1, (unsigned long) getpid()); 

      for (size_t j = 1 + i * 2; j < 3 + i * 2; ++j) { 
       pids[j] = fork(); 

       if (pids[j] == -1) { 
        perror("fork() error"); 
        exit(EXIT_FAILURE); 
       } 
       else if (pids[j] == 0) { 
        printf("P%zu created (%lu).\n", j + 1, 
          (unsigned long) getpid()); 
        sleep(8 - j); 
        printf("P%zu exiting.\n", j + 1); 
        exit(EXIT_SUCCESS); 
       } 
      } 

      for (size_t j = 2 + i * 2; j >= 1 + i * 2; --j) { 
       if (waitpid(pids[j], NULL, 0) == -1) { 
        perror("waitpid() error"); 
        exit(EXIT_FAILURE); 
       } 
       printf("Waited for P%zu (%lu).\n", j + 1, 
         (unsigned long) pids[j]); 
      } 

      printf("P%zu exiting.\n", i + 1); 
      exit(EXIT_SUCCESS); 
     } 
    } 

    for (size_t i = 2; i > 0; --i) { 
     if (waitpid(pids[i], NULL, 0) == -1) { 
      perror("waitpid() error"); 
      exit(EXIT_FAILURE); 
     } 
     printf("Waited for P%zu (%lu).\n", i + 1, (unsigned long) pids[i]); 
    } 

    printf("P1 exiting.\n"); 

    return 0; 
} 

с выходом:

[email protected]:~/src/sandbox$ ./procs 
P1 created (27206). 
P2 created (27207). 
P3 created (27208). 
P4 created (27209). 
P5 created (27210). 
P6 created (27211). 
P7 created (27212). 
P7 exiting. 
Waited for P7 (27212). 
P6 exiting. 
Waited for P6 (27211). 
P3 exiting. 
Waited for P3 (27208). 
P5 exiting. 
Waited for P5 (27210). 
P4 exiting. 
Waited for P4 (27209). 
P2 exiting. 
Waited for P2 (27207). 
P1 exiting. 
[email protected]:~/src/sandbox$ 

Заметим, что порядок, в котором запускаются процессы по своей природе непредсказуемы, поэтому каждый раз, когда вы запускаете его можно получить несколько иные результаты. Я не пытался заставить их создавать или выходить по порядку, за исключением полузаверенной попытки в sleep() в четырех листовых процессах, которая в противном случае была бы там, чтобы держать их в живых достаточно долго. Вы почти гарантируете выполнение и завершение заказа со стратегическими вызовами до sleep() или гарантируете его с помощью какой-либо формы межпроцессного взаимодействия. Как правило, вы не должны заботиться об этом порядке, просто о том, будет ли ваша фактическая работа выполнена в порядке.

Но он выполняет критерии сохранения всех процессов до того, как кто-либо из них начнет умирать.

+0

Спасибо человеку. Компиляция кода я получил: 'P1 (3808), P3 (3810), P2 (3809)' -> Различный порядок, но мы можем видеть, что это нормально из-за Pids. Но теперь у меня есть: 'P6 (3811) P4 (3813) P7 (3812) P5 (3814)'. Как Pids находятся в различном порядке, разве это не означает, что он создается в неправильном порядке? – PlayHardGoPro

+1

@PlayHardGoPro: Я отсылаю вас к этой части моего ответа: «Обратите внимание, что порядок выполнения процессов по своей природе непредсказуем». –

+0

Вы рок! Работа прекрасна. Но я не мог понять причину этих «циклов». Я обновил свой код и создаю отлично, но процессы не умирают в правильном порядке. (дочерний элемент перед родителем). Не могли бы вы быстро взглянуть? – PlayHardGoPro

Смежные вопросы