Положительная сторона использования lvm таким образом заключается в том, что он упрощает расширение, и новые диски не обязательно должны быть одинакового размера. С другой стороны, mdadm raid10 с 4 дисками, настроенный для использования режима смещения чередования, может обеспечить производительность последовательного чтения, близкую к производительности raid0 с 4 дисками, но полоса lvm поверх двух mdadm raid1 имеет производительность только двух дисков.
Я украл эту программу на 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 жестко запрограммирован в программе выше.
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 лет назад или так )).