LINUX.ORG.RU

c++ Не могу открыть fifo-файл для чтения.


0

0

Добрый день!

Не могу открыть fifo-файл для чтения.
Файл создан командой mkfifo /tmp/brdfifo

Вот кусок кода:

int main(int argc, char *argv[])
{
	//...
		
	const char* filename = "/tmp/brdfifo";
	if (access(filename, R_OK) == 0)
	{
		std::ifstream fifo(filename);
	}	

	//...
}

strase обрывается на полуслове:
---------
close(3)                                = 0
munmap(0x40031000, 68795)               = 0
brk(0)                                  = 0x8050f44
brk(0x8071f44)                          = 0x8071f44
brk(0)                                  = 0x8071f44
brk(0x8072000)                          = 0x8072000
access("/tmp/brdfifo", R_OK)            = 0
open("/tmp/brdfifo", O_RDONLY 
-----------

-- то же самое происходит, если я пытаюсь открыть файл через open и fopen;
-- если меняю имя файла на другое, текстового, существующего -- открывает;
-- написал отдельно подобный маленький тестик -- все работает.
Не понимаю, почему тогда в этом модуле не работает?

Помогите, а?
Для ответов на уточняющие вопросы я к вашим услугам.
Спасибо.

xnix@darkstar:/tmp$ mkfifo gavno xnix@darkstar:/tmp$ strace cat gavno [..] open("gavno", O_RDONLY

open завершится когда другой процесс откроет файл на запись

xnix ★★
()

Из APUE Стивенса:

When we open a FIFO, the nonblocking flag (O_NONBLOCK) affects what happens.

-In the normal case (O_NONBLOCK not specified), an open for read-only blocks until some other process opens the FIFO for writing. Similarly, an open for write-only blocks until some other process opens the FIFO for reading.

-If O_NONBLOCK is specified, an open for read-only returns immediately. But an open for write-only returns 1 with errno set to ENXIO if no process has the FIFO open for reading.

As with a pipe, if we write to a FIFO that no process has open for reading, the signal SIGPIPE is generated. When the last writer for a FIFO closes the FIFO, an end of file is generated for the reader of the FIFO.

andron01
()
Ответ на: комментарий от andron01

Спасибо всем,
я всё понял! :)

efix
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.