unlink и mkfifo

Модератор: Модераторы разделов

akademik
Сообщения: 3
ОС: Linux

unlink и mkfifo

Сообщение akademik »

Товарищи, подскажите в чем проблема

Есть код

Код: Выделить всё

...

sprintf (namebuf, "fifo%d.out", current_client_order);
unlink (namebuf);
if (mkfifo (namebuf, O_RDONLY|O_WRONLY|O_NONBLOCK|0622) < 0)
{
    perror ("mkfifo");
    exit (-1);
}
if (pipe_fd_in = open (namebuf, O_RDONLY)) < 0)
{
    perror ("open");
    exit (-1);
}
...


От раза к разу он выполняется по-разному. Иногда проходит нормально, но чаще всего во время вызова open выдает "open: No such file or directory", что очень странно, ведь до этого был успешный вызов mkfifo.
Создается впечатление будто вызов unlink просто ставит операцию удаления в очередь :), которая иногда происходит уже после mkfifo...
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: unlink и mkfifo

Сообщение KiWi »

А вы

Код: Выделить всё

printf("%s\n", namebuf);

Сделайте и наблюдайте)
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: unlink и mkfifo

Сообщение d_Sun »

man unlink , что бы не создавалось вспечатление "будто вызов unlink просто ставит операцию удаления в очередь smile.gif, которая иногда происходит уже после mkfifo..." ;)
Моя подпись сильно длинная :)
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: unlink и mkfifo

Сообщение v04bvs »

man 3 mkfifo
Спасибо сказали:
akademik
Сообщения: 3
ОС: Linux

Re: unlink и mkfifo

Сообщение akademik »

"спасибо" за советы про ман;) документацию читать умею

выяснил истинную причину:
в другом процессе созданный fifo открывался как open (namebuf, O_WRONLY | O_NONBLOCK)
т.е. флаг O_NONBLOCK как выяснилось не может быть одновременно с O_WRONLY. Убрал здесь
этот O_NONBLOCK и все пошло нормально

возник теперь другой вопрос: как организовать неблокирующую запись в канал?
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: unlink и mkfifo

Сообщение d_Sun »

akademik писал(а):
18.07.2006 14:01
"спасибо" за советы про ман;) документацию читать умею


Та вы шо? Умеем читать документацию? Из man 3 mkfifo ->

See fifo(4) for non-blocking handling of FIFO special files.
Моя подпись сильно длинная :)
Спасибо сказали:
akademik
Сообщения: 3
ОС: Linux

Re: unlink и mkfifo

Сообщение akademik »

d_Sun писал(а):
18.07.2006 14:18
Та вы шо? Умеем читать документацию? Из man 3 mkfifo ->


See fifo(4) for non-blocking handling of FIFO special files.



2d_sun я делаю вывод о том, что Вы не знаете ответа на вопрос, отличного от man 4 fifo и иже с ним
Вы сами-то туда заглядывали в fifo(4)? :) Загляните. Прошу вас в будущем быть более корректным,
если нечего сказать, что-нибудь кроме rtfm, то лучше вообще не писать.

2moderator: наверное имеет смысл сообщения типа man и rtfm отнести к пункту 2.6 правил
2.6. Что написание малосодержательных сообщений, в том числе состоящих из одних смайликов или цитат, приведёт к раздражению участников форума.
Такие сообщения не несут никакой смысловой нагрузки

Проблема решилась открытием канала с флагом O_RDWR | O_NONBLOCK. В случае если оставить только на запись O_WRONLY | O_NONBLOCK, то не всегда срабатывает (но _срабатывает_ :) бог весть как
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: unlink и mkfifo

Сообщение d_Sun »

akademik писал(а):
18.07.2006 16:07
2d_sun я делаю вывод о том, что Вы не знаете ответа на вопрос, отличного от man 4 fifo и иже с ним
Вы сами-то туда заглядывали в fifo(4)? :) Загляните. Прошу вас в будущем быть более корректным,
если нечего сказать, что-нибудь кроме rtfm, то лучше вообще не писать.


В вашем случае ни какой rtfm не поможет - это очевидно. Потому как

akademik писал(а):
18.07.2006 16:07
Проблема решилась открытием канала с флагом O_RDWR | O_NONBLOCK. В случае если оставить только на запись O_WRONLY | O_NONBLOCK, то не всегда срабатывает (но _срабатывает_ :) бог весть как


Процесс может открыть FIFO в неблокирующем режиме. В этом случае открытие только для чтения будет успешным даже если никто еще не открыл файл для записи с другого конца; открытие для записи завершится с ошибкой ENXIO (нет такого устройства или адреса), если другой конец еще не открыт.


Процесс может открыть FIFO в неблокирующем режиме. В этом случае открытие только для чтения будет успешным даже если никто еще не открыл файл для записи с другого конца; открытие для записи завершится с ошибкой ENXIO (нет такого устройства или адреса), если другой конец еще не открыт.


Процесс может открыть FIFO в неблокирующем режиме. В этом случае открытие только для чтения будет успешным даже если никто еще не открыл файл для записи с другого конца; открытие для записи завершится с ошибкой ENXIO (нет такого устройства или адреса), если другой конец еще не открыт.


Три раза вам достаточно?

akademik писал(а):
18.07.2006 16:07
Такие сообщения не несут никакой смысловой нагрузки


Для вас видимо вообще ничего не несет смысловой нагрузки.
Моя подпись сильно длинная :)
Спасибо сказали: