les écritures sur la capacité de tuyau par défaut nécessiteront toujours de réveiller la commande en aval
Si votre objectif n'est pas de réveiller trop souvent la commande en aval, avez-vous essayé d'utiliser le -p
option à buffer
? Cela devrait causer buffer
pour maintenir les écritures jusqu'à ce que le tampon soit rempli à un certain pourcentage. Vous pourriez avoir besoin du -s
possibilité également d'écrire de gros morceaux.
Mise à jour :D'oh, les tuyaux entre les commandes limitent toujours les choses. Essayez peut-être d'utiliser le programme d'adaptateur suivant :
#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);
}
comme dans :
adapter 1 (BIGSIZE) cmd1 | cmd2
ou encore :
adapter 1 (BIGSIZE) cmd1 | adapter 1 (BIGSIZE) buffer [args] | cmd2
si cmd1
fait encore de petites écritures.
Sur la base des suggestions de DepressedDaniel et Stéphane Chazelas, j'ai choisi ce qui se rapprochait le plus d'un oneliner que j'ai pu trouver :
function hugepipe {
perl -MFcntl -e 'fcntl(STDOUT, 1031, 1048576) or die $!; exec { $ARGV[0] } @ARGV or die $!' "[email protected]"
}
Cela permet de faire :
hugepipe <command> | <command>
et le tuyau entre les deux commandes va avoir la capacité spécifiée via le fcntl
dans le script perl.