zápisy přes výchozí kapacitu kanálu budou stále vyžadovat probuzení downstream příkazu
Pokud vaším cílem není příliš často probouzet downstream příkaz, zkusili jste použít -p
možnost buffer
? Mělo by to způsobit buffer
podržet zápisy, dokud se vyrovnávací paměť nenaplní na určité procento. Možná budete potřebovat -s
možnost také psát velké kusy.
Aktualizace:D'oh, roury mezi příkazy stále omezují věci. Možná zkuste použít následující program adaptéru:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char** argv)
{
fcntl(atoi(argv[1]), F_SETPIPE_SZ, atoi(argv[2]));
execvp(argv[3],argv+3);
while (1);
}
jako v:
adapter 1 (BIGSIZE) cmd1 | cmd2
nebo dokonce:
adapter 1 (BIGSIZE) cmd1 | adapter 1 (BIGSIZE) buffer [args] | cmd2
pokud cmd1
stále dělá malé zápisy.
Na základě návrhů DepressedDaniel a Stéphane Chazelas jsem se rozhodl pro to, co je nejblíže k onelineru, který jsem našel:
function hugepipe {
perl -MFcntl -e 'fcntl(STDOUT, 1031, 1048576) or die $!; exec { $ARGV[0] } @ARGV or die $!' "[email protected]"
}
To umožňuje:
hugepipe <command> | <command>
a roura mezi dvěma příkazy bude mít kapacitu určenou pomocí fcntl
ve skriptu perl.