Проверить, открыт ли именованный канал для чтения

Положительная сторона использования lvm таким образом заключается в том, что он упрощает расширение, и новые диски не обязательно должны быть одинакового размера. С другой стороны, mdadm raid10 с 4 дисками, настроенный для использования режима смещения чередования, может обеспечить производительность последовательного чтения, близкую к производительности raid0 с 4 дисками, но полоса lvm поверх двух mdadm raid1 имеет производительность только двух дисков.

0
05.06.2019, 03:41
2 ответа

Я украл эту программу на C уhttps://stackoverflow.com/a/20694422/5047085:

#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<fcntl.h>
#include<stdlib.h>
#include <sys/stat.h>

#define SERVFIFO "/Users/alex/.locking/ql/locks/a/fifo.lock"
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)

void syserr(const char *str){
    perror(str);
    exit(1);
}

int main(int argc, char** argv){

    umask(0);

    // try to open for write with no readers

    int fdw = open(SERVFIFO, O_WRONLY | O_NONBLOCK);

    if (fdw == -1){
      syserr("non-blocking open for write with no readers failed");
    }

    // create a reader - the process itself - non-blocking

    int fdr = open(SERVFIFO, O_RDONLY | O_NONBLOCK);
    if (fdr == -1){
      syserr("non-blocking open for read no writers failed");
    }

    // try again to open for write but this time with a reader
    fdw = open(SERVFIFO, O_WRONLY | O_NONBLOCK);

    if (fdw == -1){
      syserr("non-blocking open with readers failed");
    }


    printf("non-blocking open for write succeeded\n");

    close(fdw);
    close(fdr);

}

если он выходит с 0, это означает, что кто-то уже читает из именованного канала? И если он выходит с 1, это означает, что его никто не читает.

Это может быть ошибкой, но базовое тестирование показывает, что это работает. Путь fifo жестко запрограммирован в программе выше.

-1
28.01.2020, 03:37
if /bin/echo unlocked 1<>fifo >fifo; then
    there are readers
else
    no there ain\'t
fi

is_named_pipe_being_read(){ /bin/echo unlocked 1<>"$1" >"$1"; }

/bin/echoбудет уничтожен SIGPIPEи вернет ненулевой -статус, если нет считывателей.

Вы не можете использовать встроенный -вecho(даже в подоболочке ), потому что SIGPIPEбудет либо пойман, либо уничтожит всю оболочку.

Как и в версии из ОП, это деструктивно. Если у вас есть GNU dd, вы можете просто попробовать открыть файл с помощью O_NONBLOCK, начиная сC:

is_named_pipe_being_read(){ dd oflag=nonblock conv=notrunc,nocreat count=0 of="$1" 2>/dev/null; }

Но это не намного лучше; если в канал есть другие писатели, автоматическое закрытие fifo при выходе команды приведет к тому, что все читатели получат EOF.

Примечание:использование именованных каналов является скорее вопросом мазохизма или стандартной педантичности [1]. API сокетов BSD, реализованный сокетами домена unix, несравненно лучше (, поэтому он правит миром; -)), и есть такие программы, как более новые версии netcat, которые также позволяют использовать его из оболочки.

[1] который в примерах, подобных приведенному выше или этому , не работает из-за того, что открытие fifo в режиме rw является «неопределенным» в соответствии со стандартом, хотя реализовано то же самое в большинстве систем 30 лет назад или так )).

4
28.01.2020, 03:37

Теги

Похожие вопросы