le scritture sulla capacità della pipe predefinita richiederanno comunque il risveglio del comando downstream
Se il tuo obiettivo non è svegliare troppo spesso il comando downstream, hai provato a utilizzare -p
opzione a buffer
? Dovrebbe causare buffer
per trattenere le scritture finché il buffer non viene riempito fino a una certa percentuale. Potresti aver bisogno del -s
anche un'opzione per scrivere blocchi grandi.
Aggiornamento:D'oh, i tubi tra i comandi limitano ancora le cose. Forse prova a utilizzare il seguente programma adattatore:
#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);
}
come in:
adapter 1 (BIGSIZE) cmd1 | cmd2
o anche:
adapter 1 (BIGSIZE) cmd1 | adapter 1 (BIGSIZE) buffer [args] | cmd2
se cmd1
fa ancora piccole scritture.
Sulla base dei suggerimenti di DepressedDaniel e Stéphane Chazelas, ho optato per la cosa più vicina a una battuta che potessi trovare:
function hugepipe {
perl -MFcntl -e 'fcntl(STDOUT, 1031, 1048576) or die $!; exec { $ARGV[0] } @ARGV or die $!' "[email protected]"
}
Questo permette di fare:
hugepipe <command> | <command>
e la pipe tra i due comandi avrà la capacità specificata tramite fcntl
nello script perl.