Размер буфера пайпа

17 май 2015 22:45


Запись данных в пайп, как правило, атомная операция в пределах размера буфера пайпа. До Linux 2.6.11 ёмкость пайпа составляла 4Кбайта, после её увеличили до 64Кбайт. А вот в 2.6.35 появилась возможность менять размер буфера, в том числе и непривигелированному процессу. Для этих целей можно воспользоваться вызовом fcntl с операцией F_SETPIPE_SZ.

В Perl модуль Fcntl ничего не знает о таких операциях как F_SETPIPE_SZ или F_GETPIPE_SZ, но, как выяснилось это не проблема:

use Fcntl;
# bits/fcntl-linux.h
use constant {
    F_SETPIPE_SZ => 1031,
    F_GETPIPE_SZ => 1032,
};
 
pipe my $r, my $w or die $!; 
 
print "buffer:  " . fcntl( $r, F_GETPIPE_SZ, 0 ) . "\n";
fcntl( $w, F_SETPIPE_SZ, 512 * 1024 );
print "buffer:  " . fcntl( $r, F_GETPIPE_SZ, 0 ) . "\n";

Программа выведет размер буфера до и после изменения:

buffer:  65536
buffer:  524288

Максимальный размер буфера пайпа для простых пользователей задан в /proc/sys/fs/pipe-max-size (1 Мб).

↓↓↓↓↓↓↓↓

Теги: perl pipe


Оставить комментарий