2014-11-16 3 views
0

Я работаю с трубами, и одна труба не открывается, хотя mkfifo() был успешным.Как увидеть ошибку open()

У меня есть это:

/* create the FIFO (named pipe) */ 
int ret_mk = mkfifo(out_myfifo, 0666); 
if(ret_mk < 0) { 
    perror(out_myfifo); 
    unlink(out_myfifo); 
    return -1; 
} 

printf("ret_mk = %d\n", ret_mk); 
/* write to the FIFO */ 
out_fd = open(out_myfifo, O_WRONLY); 
printf("out_fd = %d\n", out_fd); 

, но ничего не печатается после open(), даже печать произвольного текста не будет отображаться.

От here мы имеем:

open() функция возвращает целое значение, которое используется для обозначения файла. Если он неудачен, он возвращает -1 и устанавливает глобальную переменную errno, чтобы указать тип ошибки.

Что я могу сделать, чтобы понять, почему он не откроется?

+1

Ваш код не показывает, как вы знаете, что 'mkfifo()' был успешным. Вам нужно будет захватить или проверить значение, возвращаемое 'mkfifo()', и продемонстрировать, что было 0, чтобы знать, что 'mkfifo()' был успешным. И, как вы теперь знаете, если вы не видите напечатанный номер дескриптора файла, это происходит потому, что 'open()' не завершился, потому что ни один процесс не имеет открытого FIFO для чтения. –

ответ

2

Прочитано fifo(7). Для FIFO может быть заблокирован вызов open. Для того, чтобы open(2) неблокирующих, используйте O_NONBLOCK в аргументе флага:

out_fd = open(out_myfifo, O_WRONLY|O_NONBLOCK); 
if (out_fd<0) perror(out_myfifo); 
printf("%d\n", out_fd); 

Но обычно вы хотите блокирующий open для записи на FIFO, потому что какой-то другой процесс должен open в же FIFO для чтения (и вы хотите, чтобы ваш процесс написания ожидал, что это произойдет).

Обратите внимание, что не существует poll(2) событий, когда кто-то открыл другой конец вашего FIFO (потому что хочет открыть дескриптор файла). См. Также inotify(7); вы также можете использовать сокеты unix(7).

BTW, вы также можете использовать strace(1) для целей отладки.

См. Также intro(2) и Advanced Linux Programming.

+0

Хорошо, я понимаю, что вы подразумеваете, блокируя. Вы знаете, почему мой вопрос был отклонен? – gsamaras

+0

Я думаю, из-за RTFM. Я не ответил на ваш вопрос, но вопрос, ответ на который сразу доступен на страницах руководства, не «показывает исследовательские усилия». –

+0

Ссылка, которую я использовал, не покрывала это. В любом случае, это означает, что вопрос не полезен для сайта, но я не могу его удалить из-за ваших ответов, что я должен делать сейчас? :/Кстати, как вы думаете, это вопрос -1? – gsamaras