las escrituras sobre la capacidad predeterminada de la tubería aún requerirán activar el comando aguas abajo
Si su objetivo no es activar el comando descendente con demasiada frecuencia, ¿intentó usar el -p
? opción a buffer
? Debería causar buffer
para mantener las escrituras hasta que el búfer se llene hasta cierto porcentaje. Es posible que necesite el -s
opción también para escribir fragmentos grandes.
Actualización:D'oh, las tuberías entre los comandos aún limitan las cosas. Tal vez intente usar el siguiente programa adaptador:
#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);
}
como en:
adapter 1 (BIGSIZE) cmd1 | cmd2
o incluso:
adapter 1 (BIGSIZE) cmd1 | adapter 1 (BIGSIZE) buffer [args] | cmd2
si cmd1
todavía hace escrituras pequeñas.
Basándome en las sugerencias de DepressedDaniel y Stéphane Chazelas, me decidí por lo más parecido a un oneliner que pude encontrar:
function hugepipe {
perl -MFcntl -e 'fcntl(STDOUT, 1031, 1048576) or die $!; exec { $ARGV[0] } @ARGV or die $!' "[email protected]"
}
Esto permite hacer:
hugepipe <command> | <command>
y la tubería entre los dos comandos tendrá la capacidad especificada a través de fcntl
en el script perl.