Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Вопросы по FIFO


Автор: vitaly1979 8.2.2007, 20:37
Кто нибудь знает можно ли одновременно писать некольким процессам в именованный канал FIFO?
И сколько может он вместить пока данные не прочитаны одним из процессов?

Автор: MAKCim 8.2.2007, 21:31
Цитата(vitaly1979 @  8.2.2007,  20:37 Найти цитируемый пост)
Кто нибудь знает можно ли одновременно писать некольким процессам в именованный канал FIFO?

да, но O_NONBLOCK не должен быть установлен и объем записываемых данных не должен превышать PIPE_BUF байт
Цитата(vitaly1979 @  8.2.2007,  20:37 Найти цитируемый пост)
И сколько может он вместить пока данные не прочитаны одним из процессов? 

PIPE_BUF байт

Автор: vitaly1979 9.2.2007, 12:24
MAKCim, подскажите, а чему приблизительно равно значение PIPE_BUF в Linux?
Вообще то я под UNix использую Perl, для моих задач хватает, а написал сюда вопрос потому что думаю в этом разделе найдется больше
знающих по FIFO.
И все же. 
Если я открываю в perl скрипте, указывая "+>" или "+<" я так понимаю O_NONBLOCK устанавливается, потому как нить не блокируется,
ожидая на другом конце кого-то.
Чем чревато O_NONBLOCK ?
Хотя я использую ioctl для чтения, и 1-й результат записи 2-х процессов в 1 FIFO дал положительный результат.

Автор: vitaly1979 9.2.2007, 13:55
1 вопрос снимается )
#define PIPE_BUF        4096    /* # bytes in atomic write to a pipe */

Автор: vitaly1979 9.2.2007, 15:35
Цитата

write(3) - Linux man page

Write requests of {PIPE_BUF} bytes or less shall not be interleaved with data from other processes doing writes on the same pipe. Writes of greater than {PIPE_BUF} bytes may have data interleaved, on arbitrary boundaries, with writes by other processes, whether or not the O_NONBLOCK flag of the file status flags is set.


Так чтож это за зверек такой PIPE_BUF
Определяет ли он максимальный размер канала?
В документации говорится что при записи менее чем  PIPE_BUF байт данные не смешаются из разных процессов.

Видимо нужно на практике проверить, чем ждать ответа на форуме  smile 

Автор: vitaly1979 9.2.2007, 17:28
Возможно полезны будут кому-либо результаты эксперемента моего, так уж и быть, опубликую smile 
Ось FC4 даёт записать в FIFO 64 кб данных, после чего операция записи(perl: print or syswrite) блокируется до появления читающего.

Автор: MAKCim 9.2.2007, 18:28
Цитата(vitaly1979 @  9.2.2007,  15:35 Найти цитируемый пост)
В документации говорится что при записи менее чем  PIPE_BUF байт данные не смешаются из разных процессов.

да, запись из разных процессов в один канал атомарна, если порция записываемых данных не превышает PIPE_BUF байт
Цитата(vitaly1979 @  9.2.2007,  17:28 Найти цитируемый пост)
Ось FC4 даёт записать в FIFO 64 кб данных, после чего операция записи(perl: print or syswrite) блокируется до появления читающего.

вполне возможно, ты же сам привел цитату
Цитата

#define PIPE_BUF        4096    /* # bytes in atomic write to a pipe */


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)