POSIX FIFO зависает при открытии в режиме блокировки - PullRequest
0 голосов
/ 29 мая 2020

По умолчанию POSIX FIFO открывается в режиме блокировки. Моя проблема в том, что когда я открываю его в режиме блокировки, он просто зависает (блокируется), и больше ничего не происходит.

Первоначально я открывал обе стороны с помощью флага RDWR, и у меня не было проблем, потому что RDWR делает его неблокирующим, потому что «В Linux открытие FIFO для чтения и записи будет успешным как в блокирующем, так и в неблокирующем режиме» (https://linux.die.net/man/7/fifo). Но в неблокирующем режиме у меня иногда выпадают записи, поэтому мне нужно открыть его в режиме блокировки.

Вот как я вызываю mkfifo:

int64_t fifo_setup(char * fifo_name)
{
    if (mkfifo(fifo_name, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH) == -1) {
        perror("mkfifo");
        exit(EXIT_FAILURE); }

   return 0; }

Мой исходный вызов для открытия:

int64_t fifo_open(char * fifo_name, int64_t read_write) {

    int c;

    if (read_write == 1) { 
        c = open(fifo_name, O_RDWR);}
    if (read_write == 2) { 
        c = open(fifo_name, O_RDWR);}

    perror("open");

    return (c);
}

Затем я изменил его на:

int64_t fifo_open(char * fifo_name, int64_t read_write) {

    int c;

    if (read_write == 1) { 
        c = open(fifo_name, O_WRONLY);}
    if (read_write == 2) { 
        c = open(fifo_name, O_RDONLY);}

    perror("open");

    return (c);
}

Моя программа достигает открытого вызова для потоков записи (это вызов NASM для C):

Open_FIFO_Write:
lea rdi,[fifo_name]
mov rsi,1
call fifo_open wrt ..plt
mov [fifo_write_fd],rax

Но затем терминал Putty зависает (блокируется), и больше ничего не происходит. Я так и не добрался до блока, открывающего читающую сторону. В частности, он блокируется непосредственно перед достижением perror ("open") в приведенном выше коде fifo_open:

Согласно странице руководства Linux по адресу https://www.man7.org/linux/man-pages/man7/fifo.7.html, «Обычно, открытие FIFO блоков, пока не откроется другой конец ". Это здорово, но я не могу добраться до кода, который открывает средство записи, потому что средство чтения блокирует весь дальнейший прогресс. Это похоже на мексиканское противостояние.

Конечно, способ должен быть, но мои исследования еще не нашли его.

Спасибо за любую помощь в этом.

1 Ответ

3 голосов
/ 29 мая 2020

Три варианта:

  1. FIFO сами по себе не отбрасывают сообщения в неблокирующем режиме. Если ваш код отбрасывает сообщения, исправьте свой код, чтобы перестать это делать, а затем просто используйте неблокирующий режим.
  2. Откройте FIFO в неблокирующем режиме, а затем, как только вы откроете оба конца, используйте fcntl, чтобы изменить его в режим блокировки.
  3. Используйте отдельный поток или процесс для открытия каждой половины FIFO.
...