2013-11-02 3 views
0

У меня есть вилка, возникающая в цикле, а над вилкой я запрашиваю вход пользователя. В моем разветвленном процессе также есть печать. Поскольку нет гарантии того, что процессы будут запущены, я часто (или всегда) получаю линии от процесса дочернего процесса между моим приглашением пользователю и местом, где они могут вводить информацию.Подождите, пока часть детского процесса закончится?

Т.е., я получаю что-то вроде этого:

Enter info: <OUTPUT FROM CHILD> 
_ 

(где _ означает, что пользователь может ввести вход.)

Поскольку я пытаюсь, чтобы мой родительский процесс fork many children (каждый из которых основан на части информации, предоставленной пользователем), которая выполняется одновременно, я не могу дождаться, когда ребенок закончится, прежде чем позволить родителям продолжить работу. Есть ли способ заставить родителя ждать, пока часть ребенка завершится, прежде чем двигаться дальше?

+0

Вы считаете использование семафоров? если да, то почему вы решили против них и что еще вы пробовали? – UnholySheep

+0

@ UnholySheep Я действительно сделал. Я попробовал установить флаг, и родитель подождал, пока ребенок не будет установлен в 1 (продолжая, если флаг не был 1), но на второй итерации программа перестает отвечать. При печати флага я видел, что он не менялся (он печатал 0). Поэтому по какой-то причине он пытается выполнить родительский элемент и не будет выполнять две строки дочернего элемента, к которому я бы хотел вернуться, прежде чем вернуться к родительскому элементу. –

+0

Если у вас есть этот код, вы можете попробовать открыть новый вопрос об этом, возможно, мы сможем помочь вам решить проблему. Я лично не могу придумать лучшего варианта использования семафоров для вашей проблемы, но, возможно, у кого-то еще будет решение для вас – UnholySheep

ответ

0

Многое зависит от того, что вы действительно пытаетесь сделать, но вы не можете использовать waitpid() или wait(), чтобы дождаться завершения части процесса. Семейство ожидающих функций ожидает отмирающих процессов или процессов, которые были остановлены из-за сигнала (SIGSTOP, SIGTTIN, SIGTTOU и т. Д.).

Некоторые вопросы:

  • Если выход из дочерних процессов направляются на экран, что приводит к этой путанице, или он должен быть отправлен в файл?
  • Или, если программа имеет трубу от каждого ребенка, чтобы она могла считывать выходные данные от ребенка и отображать ее на соответствующей части экрана, когда это удобно?
  • Или, в оконной среде, следует ли отправлять сообщения детям в другое окно (например, окно консоли)?
  • Или должны ли дети писать демону syslog?
  • Или должны ли дети зависеть от сигнала SIGTTOU?

Многое зависит от цели сообщений и важности немедленного отображения сообщений.

0

Другие ответы, безусловно, более общие, и правильный способ решения этой проблемы будет включать в себя какую-то трубу, но мой случай был на самом деле очень простым и просто требовал от родителя подождать некоторое время, поэтому я добавил usleep(), чтобы родительский ресурс подождал несколько миллисекунд, чтобы ребенок закончил печать. Это определенно не идеально, но это сработало.

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