У меня есть fifo, открытый как RDWR (для обмена процессами) и трубы (process-thread), как я могу понять, когда я достигаю пределов трубы или фикс? Когда я пытаюсь написать более 64 КБ, он просто ждет в write().c - понять, если труба/fifo заполнена
ответ
Вы должны использовать неблокируемому режим:
pipe2(fds, O_NONBLOCK);
Или, если вам нужно сделать это после того, как труба была создана:
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
Теперь, когда вы читаете или писать, и операция не может завершите немедленно, он вернется. Затем вы можете использовать select()
или poll()
, чтобы узнать, когда чтение или письмо возможно снова (или вы можете просто заняться-ждать).
И он вернет '-1' и установит' errno' в 'EAGAIN' - POSIX [' write() '] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html) говорит : _ Запрос на запись для {PIPE_BUF} или меньше байтов должен иметь следующий эффект: если в трубе имеется достаточное пространство, write() передает все данные и возвращает количество запрошенных байтов. В противном случае write() не передает данные и возвращает -1 с errno, установленным в [EAGAIN] ._ –
Я должен отметить, что приведенное выше описание относится к каналу или FIFO с установленным флагом 'O_NONBLOCK' - прочитайте остальную часть спецификация поведения при других обстоятельствах. –
Это как трубы работают. Если труба заполняется, когда вы пишете на нее, 'write' будет блокироваться до тех пор, пока данные не будут удалены из трубы. –
Откройте неблокирование и проверьте результат 'write'. – Olaf