2016-05-07 3 views
2

У меня есть fifo, открытый как RDWR (для обмена процессами) и трубы (process-thread), как я могу понять, когда я достигаю пределов трубы или фикс? Когда я пытаюсь написать более 64 КБ, он просто ждет в write().c - понять, если труба/fifo заполнена

+3

Это как трубы работают. Если труба заполняется, когда вы пишете на нее, 'write' будет блокироваться до тех пор, пока данные не будут удалены из трубы. –

+4

Откройте неблокирование и проверьте результат 'write'. – Olaf

ответ

3

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

pipe2(fds, O_NONBLOCK); 

Или, если вам нужно сделать это после того, как труба была создана:

int flags = fcntl(fd, F_GETFL, 0); 
fcntl(fd, F_SETFL, flags | O_NONBLOCK); 

Теперь, когда вы читаете или писать, и операция не может завершите немедленно, он вернется. Затем вы можете использовать select() или poll(), чтобы узнать, когда чтение или письмо возможно снова (или вы можете просто заняться-ждать).

+3

И он вернет '-1' и установит' errno' в 'EAGAIN' - POSIX [' write() '] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html) говорит : _ Запрос на запись для {PIPE_BUF} или меньше байтов должен иметь следующий эффект: если в трубе имеется достаточное пространство, write() передает все данные и возвращает количество запрошенных байтов. В противном случае write() не передает данные и возвращает -1 с errno, установленным в [EAGAIN] ._ –

+2

Я должен отметить, что приведенное выше описание относится к каналу или FIFO с установленным флагом 'O_NONBLOCK' - прочитайте остальную часть спецификация поведения при других обстоятельствах. –