LINUX.ORG.RU

Проблема с FIFO (именованые каналы)


0

0

Ситуация такова:

два процесса p1 и p2.
p1 создает fifo1 и fifo2 и открывает их на чтение и запись, соответственно.
p2 открывает fifo2 и fifo1 на чтение и запись.

Проблема такая:
p1 создал оба fifo. открывает fifo1 на чтение и "засыпает" на syscall open(),
точнее ждет, пока кто-нибудь не откроет fifo1 на запись...
p2 открыл fifo1 на запись.
p1 открывает на запись fifo2 и опять "засыпает" на системном вызове open().

Можно ли сделать так, что бы p1 не "засыпал" на open()?
А вот на вызовах read() и write() пусть ожидает записи-чтения в канал.

fifo создавались так:
mkfifo(FIFO_REQ_NAME, FIFO_MODE);

где FIFO_MODE:
#define FIFO_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH |
S_IWOTH)

открывались так:
infile = fopen(ifname, "r");
outfile = fopen(ofname, "w");

пробывал и так:
int fd = open(ifname, O_RDONLY);

и так:
int fd = open(ifname, O_RDONLY|O_NDELAY);

пробывал игнорировать сигнал SIGPIPE:
signal (SIGPIPE, SIG_IGN);

Может кто подскажет, как тут быть?

а сообразить, в каком порядке открывать FIFO, не судьба?

anonymous
()

В p1 перед открытием fifo1 на чтение также открывай его и на запись, но потом этот fd (для записи) не юзаешь.

В p2 наоборот.

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

>а сообразить, в каком порядке открывать FIFO, не судьба?

p1 открывает сначала fifo1 на чтение а потом fifo2 на запись. p2 наоборот сначала fifo1 на запись а потом fifo2 на чтение. Разве такая последовательность не верна?

>В p1 перед открытием fifo1 на чтение также открывай его и на запись, но потом этот fd (для записи) не юзаешь. В p2 наоборот.

Так тоже не получается. При открытии ifname на запись p1 ждет открытия на чтение. Кто знает как открывать два fifo (один на read, другой на write) для взаимодействия двух процессов? Кто работал с фифо?

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

Всем пасиб.

Все заработало!!!

> а сообразить, в каком порядке открывать FIFO, не судьба?

Порядок был правильный. Проблема оказалась в другом:

был типа процесс-сервер, который сначала создавал одни фифо для запросов клиентов. Потом клиент (p2) посылает запрос (connect) процессу-серверу, после чего p1 делает fork() и уже процесс потомок (p1) открывает два фифо (fifo1 и fifo2) для взаиможействия с p2.

нужна была задержка в клиенте после посылки запроса connect и перед открытием fifo.

>В p1 перед открытием fifo1 на чтение также открывай его и на запись, но потом этот fd (для записи) не юзаешь. В p2 наоборот.

и это тоже применил. Но в другом месте. После вылезла еще проблемка:

Сервер открвает фифо для запросов и ждет открытия на запись. Клиент тоже его открывает. Потом клиент заканчивает работать и закрывает его (и больше никто не открывал его). А серверу надо чтобы этот фифо был кем-нить открыт на запись... Поэтому пришлось открывать и на чтение и на запись (но не писать).

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