Проверка C перед записью в закрытую трубу - PullRequest
4 голосов
/ 04 мая 2010

Есть ли простой способ проверить, закрыт ли канал перед записью в C? У меня есть дочерний и родительский процесс, а у родителя есть канал для записи дочернему процессу. Однако, если дочерний объект закрывает канал, а родительский пытается прочитать - я получаю ошибку сломанного канала.

Так, как я могу проверить, могу ли я писать в канал, чтобы я мог обработать это как ошибку, если не могу? Спасибо!

Ответы [ 2 ]

7 голосов
/ 04 мая 2010

Простой способ проверить это сделать запись в 0 байт (2) в канал и проверить возврат. Если вы ловите SIGPIPE или проверяете EPIPE, вы получаете ошибку. Но это так же, как если бы вы продолжили и сделали реальную запись, проверяя наличие ошибок. Поэтому просто выполните запись и обработайте ошибку либо в обработчике сигнала (SIGPIPE), либо, если сигнал игнорируется, проверив возврат ошибки из записи.

3 голосов
/ 04 мая 2010

Как насчет того, чтобы просто попытаться написать и устранить ошибку? Точно так же, как при записи в файл или базу данных. Я не вижу значения в идиоме:

check if *this* is going to work
do *this*

Вы просто вводите меньшее, и более трудное, чтобы поймать в тестировании, окно возможностей:

check if *this* is going to work
   child thinks "Ha, fooled you, I'm off now!"
do *this*, which now fails!
...