Могу ли я увеличить максимальный буфер системного канала?

попробуйте запустить # restorecon -rv / var / ww /

3
25.03.2017, 06:52
2 ответа

Следуя ответу xhienne, этот сценарий perl установит размер существующего открытого файла FIFO:

#!/usr/bin/perl
# usage: name-of-open-fifo size-in-bytes
# http://unix.stackexchange.com/a/353761/119298
use strict;
use Fcntl;
my $fifo = shift @ARGV or die "usage: fifo size";
my $size = shift @ARGV or die "usage: fifo size";
open(FD, $fifo) or die "cannot open";
printf "old size %d\n",fcntl(\*FD, Fcntl::F_GETPIPE_SZ, 0);
my $new = fcntl(\*FD, Fcntl::F_SETPIPE_SZ, int($size));
die "failed" if $new<$size;
printf "new size %d\n",$new;

Поместите это в файл, скажем ~ / setfifo , выполните на нем chmod + x и запустите его после того, как вы создали и открыли свой FIFO, например:

$ mkfifo /tmp/fifo
$ cat -n <>/tmp/fifo & 
$ ~/setfifo /tmp/fifo 1048576
 old size 65536
 new size 1048576

Если ваш perl еще не имеет констант F_GETPIPE_SZ и F_SETPIPE_SZ , вы можете просто использовать соответствующие числа, найденные при просмотре файлов C в / usr / include / . Это соответственно 1024 + 8 и 1024 + 7. Вот получившийся скрипт Perl:

#!/usr/bin/perl
# usage: name-of-open-fifo size-in-bytes
# http://unix.stackexchange.com/a/353761/119298
use strict;
# int fcntl(int fd, int cmd, ...) F_GETPIPE_SZ,void F_SETPIPE_SZ,int
# /usr/include/asm-generic/fcntl.h #define F_LINUX_SPECIFIC_BASE 1024
# /usr/include/linux/fcntl.h #define F_SETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 7)
sub F_SETPIPE_SZ{ 1024+7; }
sub F_GETPIPE_SZ{ 1024+8; }
my $fifo = shift @ARGV or die "usage: fifo size";
my $size = shift @ARGV or die "usage: fifo size";
open(FD, $fifo) or die "cannot open";
printf "old size %d\n",fcntl(\*FD, F_GETPIPE_SZ, 0);
my $new = fcntl(\*FD, F_SETPIPE_SZ, int($size));
die "failed" if $new<$size;
printf "new size %d\n",$new;
3
27.01.2020, 21:15

Ваша команда изменяет максимальный размер буфера, а не размер по умолчанию.

Из справочной страницы pipe (7) :

/ proc / sys / fs / pipe-max-size (начиная с Linux 2.6.35)

Максимальный размер (в байтов) отдельных каналов, которые могут быть установлены пользователями без возможности CAP_SYS_RESOURCE.

и:

Начиная с Linux 2.6.11, емкость канала составляет 16 страниц (т. Е. 65 536 байт в системе с размером страницы 4096 байт). Начиная с Linux 2.6.35, емкость канала по умолчанию составляет 16 страниц, но емкость можно запросить и задать с помощью fcntl (2) F_GETPIPE_SZ и F_SETPIPE_SZ операции.

Таким образом, если вы не вызовете системный вызов fcntl (F_SETPIPE_SZ) в открытом канале, он останется на своей емкости по умолчанию: 64 КБ. Для этого вы должны использовать язык, который предлагает привязку к системным вызовам (C / C ++, Python, PHP, perl, ... но не sh / bash).

7
27.01.2020, 21:15

Теги

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