Есть ли такая функция, как WaitNamedPipe или способ реализовать это на C ++ / Linux? (поэтому процесс не блокируется на канале в течение бесконечного времени) - PullRequest
0 голосов
/ 29 июля 2011

У меня есть именованный канал в моей программе на C ++. Дочерний процесс записывает в него значение, а родительский процесс читает его. Я создал канал с помощью mkfifo, и все операции блокируются (fifo не может быть открыт для чтения, пока его не попытались открыть для записи и v.v. к сожалению, иногда мой дочерний процесс не останавливается из-за ошибки в программе, которую запускает дочерний процесс. Я не ставлю задачу исправить эту ошибку в этой внешней программе, но я хочу убедиться, что родительский процесс не останавливается на бесконечное время при заблокированном вызове open fifo, а продолжается через некоторое время (без чтения значения в канале ).

Так что мне нужно что-то вроде функции WaitNamedPipe. Эта функция ожидает, пока не истечет интервал времени ожидания или не будет доступен экземпляр указанного именованного канала. http://ist.marshall.edu/ist480acp/namedpipes.html#WaitNamedPipe

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

Спасибо за любую помощь.

Ответы [ 2 ]

3 голосов
/ 29 июля 2011

Вы хотите O_NONBLOCK в ваших open(2) флажках, см. fifo(7). Затем используйте select(2) или poll(2) для ожидания ввода (с таймаутом).

2 голосов
/ 29 июля 2011

Вы можете использовать неблокирующий канал и select() вызов с тайм-аутом. Или вы можете использовать блокирующий вызов read(), позвонив перед ним alarm().

...