2016-11-16 3 views
0

Я как бы новичок во всех функциях fork, exec и wait. У меня есть задание, которое требует I fork моего основного процесса i раз, а затем использовать всех детей для записи на разные fifos для каждого процесса. Например, если у меня 3 ребенка, мне придется писать 3 разных филоса. Затем мой родительский процесс должен дождаться, когда первый закончит запись на любом fifo, и прочитайте данные из этого конкретного fifo. Что меня сбило с толку, так это то, что мой родительский процесс должен ждать завершения первого, а не для всех процессов. Если бы мне пришлось ждать все, я бы использовал while(wait(NULL)>0). Однако что вы делаете в этом случае? Я написал пример кода ниже:Несколько вилок, дождитесь окончания первого конца

pid_t *pid; 
int i; 

pid = malloc(sizeof(pid_t)*children); 
for(i=0;i<children;i++) 
{ 
    if((pid[i]=fork())<0) 
    { /* error */ } 

    if(pid[i]==0) 
    { 
      //WriteOnFifos 
      return 0; 
    } 
    else 
    { 
      //wait for the first process to finish 
    } 
} 

Заранее спасибо. Любая помощь будет оценена по достоинству.

+0

Он даже не компилируется. 'fork' не является вызовом функции –

+0

oops да, простите, я отредактирую –

+0

Не просто редактируйте. Опубликуйте полный код. –

ответ

0

Просто используйте wait(NULL). Как говорится в документации, он будет ждать, пока один из его детей не завершится. Таким образом, он будет делать то, что вы хотите, т. Е. Дождитесь окончания первого ребенка.

+0

В случае выхода первого процесса родительский процесс продолжается и считывает с fifo данные, которые первый процесс написал, что произойдет, если остальные процессы не завершили работу, и родитель хочет их прочитать? Есть ли способ подождать их? –

+0

Это другой вопрос. Я не уверен, что понимаю ваш вопрос. Может быть, вы должны прочитать некоторые основные теории по этой теме. Вы можете подождать определенного ребенка с 'waitpid (pid, NULL, 0)'. –

+0

«Что произойдет, если остальные процессы не завершили работу, и родитель хочет их прочитать?». Это зависит от того, сколько байтов вы прочитали из FIFO. Если вы читаете больше байтов, чем записал ребенок, 'read()' обычно будет блокироваться. –

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