2014-02-18 5 views
0

Я делаю поисковые запросы Google о моем вопросе в течение 2 дней, но я сделал с ним. У меня есть очень простая информация об управлении процессами, fork и т. Д. Мне сказали создать несколько дочерних процессов одного и того же родительского процесса и отправить их семена с помощью труб, чтобы они могли создавать некоторые случайные числа, все для себя. Но я застрял в создании детских процессов.создание дочерних процессов ждет другого для цикла

for (i = 0; i < NUM_PLAYERS; i++) { 
    /* TODO: spawn the processes that simulate the players */ 
    switch(pid = fork()){ 
     case -1: // ERROR 
      exit(EXIT_FAILURE); 

     case 0: // CHILD PROCESS 
      printf("My parent id is %d \n", getppid()); 
      exit(EXIT_SUCCESS); 

     default: // PARENT PROCESS 
      wait(NULL); 
    } 
} 

Когда я иду с этим кодом, родитель создает NUM_PLAYERS детей, но я не могу показаться, чтобы использовать их в другой цикл, так как они были прекращены в конце случае 0. Когда я просто удалить exit(EXIT_SUCCESS); линию, так много процессов созданы, и у них есть все разные родители. Поэтому мой вопрос заключается в том, как правильно создавать дочерние процессы и использовать их позже?

ответ

2
void do_something() 
{ 
    //create random numbers or whatnot 
} 

// ...........

case 0: // CHILD PROCESS 
    printf("My parent id is %d \n", getppid()); 
    do_something(); 
    exit(EXIT_SUCCESS); 

Вам необходимо родителя к wait на детей в более позднем цикле. То, как у вас есть, будет блокироваться до тех пор, пока не вернется один ребенок. Вы хотите создать несколько дочерних элементов до этого времени.

Обратите внимание, что вам все равно нужно добавить логику канала, чтобы родительский/дочерний объект мог связываться.

EDIT

Это широкое изложение того, что вам нужно сделать:

for (i = 0; i < NUM_PLAYERS; i++) { 
    /* TODO: spawn the processes that simulate the players */ 
    switch(pid = fork()){ 
     case -1: // ERROR 
      exit(EXIT_FAILURE); 

     case 0: // CHILD PROCESS 
      printf("My parent id is %d \n", getppid()); 
      exit(EXIT_SUCCESS); 
    } 
} 

// only the parent will ever execute below here 

for (i = 0; i < NUM_PLAYERS; i++) 
{ 
    while (/* read each child's pipe*/) 
    { 
     //do something with data 
    } 
} 

for (i = 0; i < NUM_PLAYERS; i++) 
    wait(NULL); 

return(0); 
+0

На самом деле у меня нет идеи, как это сделать. Должен ли я удалить 'wait (NULL);' и поместить его в другой цикл? –

3

Если удалить exit(EXIT_SUCCESS) ваш ребенок будет продолжать выполнение, где он был раздвоенный, IE будет вернуться к тесную привязку петли for() и генерировать новые дети. Что вы хотите, чтобы ребенок сделал? Вы должны сделать это, а затем сделать exit(EXIT_SUCCESS) и не дать ему вернуться к петле for().

Обратите также внимание, что wait() будет ждать только одного процесса для выхода.

+0

Мне нужно отправить несколько семян через трубку и вызвать функцию под названием «void shooter (int id, int seed_fd_rd, int score_fd_wr)», поэтому я думаю, что мне нужно заставить их ждать другого цикла. Но я не знаю, как заставить их ждать и получить доступ к ним в другом цикле ниже текущего цикла. –

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