Я хочу сделать программу в стиле REPL с каналами и сигналами, но моя программа блокируется - PullRequest
0 голосов
/ 24 октября 2011

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

Я сделал часть этого, но программа блокируется после первого чтения с fifo.

Я подозреваю, что проблема где-то между строк 122–199. Отключение канала приводит к тому, что программа перепрыгивает через scanf на 185 и зацикливается бесконечно. Закрытие и повторное открытие канала перед записью и после чтения приводит к тому же эффекту.

Вот источник: ссылка .


Позднее редактирование (уточнение):

Родительские блоки перед printf на 184, когда он читает вторую команду (в первый раз, кажется, она работает нормально).

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

Ребенок живет в состоянии паузы (pause ()), в то время как родитель читает входные данные и отправляет их по каналу, затем он будит ребенка и сам переходит в состояние паузы. Дочерний объект считывает данные из канала и выводит их, затем пробуждает родителя и переходит в спящий режим.

Ответы [ 2 ]

0 голосов
/ 24 октября 2011

Использовали ли вы какой-нибудь системный вызов мультиплексирования, такой как select или poll, который способен протестировать набор файловых дескрипторов, некоторые из них готовы (для ввода или для вывода)?

Подробнее о опросе или о выборе и друзьях.

0 голосов
/ 24 октября 2011

Вы должны уточнить свой вопрос, который с помощью компонента (родительского или дочернего) блокирует.

Убедитесь, что весь вывод завершен переводом строки.Кажется (из краткого прочтения), что вы используете puts(), который должен об этом позаботиться.

Попробуйте вызвать fflush() на выходе после того, как клиент будет сделан, чтобы убедиться, что вывод записывается вканал, если ребенок живет, пока родитель читает его вывод.Я недостаточно внимательно прочитал ваш код, чтобы отследить время жизни.

...