Définir la capacité du tuyau sous Linux

Existe-t-il un moyen de définir la capacité de canalisation des canaux définie dans un script Bash (ou un autre shell)? Prenez par exemple

cmd1 | cmd2

Dans les versions récentes de Linux, la capacité du canal est fixée à 64 Ko par défaut. Je sais que je peux contrôler la quantité de données «tamponnée» entre les deux process de deux façons:

  1. Utilisation de la buffer(1) : par exemple cmd1 | buffer | cmd2 cmd1 | buffer | cmd2
  2. Utiliser fcntl(2) avec l'indicateur F_SETPIPE_SZ de l'intérieur de cmd1 ou cmd2

Chaque solution présente des inconvénients: le buffer ne peut être utilisé que pour augmenter le tampon; écrit également sur la capacité du tuyau par défaut nécessitera toujours de réveiller la command en aval. fcntl , pour autant que je sache, ne peut être appelé qu'à partir de l'intérieur cmd1 ou cmd2 .

Ma question est la suivante: existe-t-il un moyen, lorsque le shell crée le tuyau, de spécifier dans le shell la capacité du tuyau?

écrit sur la capacité de canal par défaut nécessitera toujours de réveiller la command en aval

Si votre objective n'est pas de réveiller la command downstream trop souvent, avez-vous essayé d'utiliser l'option -p pour buffer ? Cela devrait faire en sorte que le buffer contienne des écritures jusqu'à ce que le tampon soit rempli à un certain pourcentage. Vous pourriez aussi avoir besoin de l'option -s pour écrire de gros morceaux.

Mise à jour: D'oh, les tuyaux entre les commands limitent toujours les choses. Peut-être essayer d'utiliser le programme 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 même:

 adapter 1 (BIGSIZE) cmd1 | adapter 1 (BIGSIZE) buffer [args] | cmd2 

si cmd1 fait encore de petites écritures.

D'après les suggestions de DepressedDaniel et Stéphane Chazelas, je me suis arrangé sur la chose la plus proche d'un oneliner que j'ai pu find:

 function hugepipe { perl -MFcntl -e 'fcntl(STDOUT, 1031, 1048576) or die $!; exec { $ARGV[0] } @ARGV or die $!' "$@" } 

Cela permet de faire:

 hugepipe <command> | <command> 

et le canal entre les deux commands va avoir la capacité spécifiée via le fcntl dans le script perl.