Schreibvorgänge über die Standard-Pipe-Kapazität erfordern immer noch das Aufwecken des Downstream-Befehls
Wenn Ihr Ziel darin besteht, den Downstream-Befehl nicht zu oft aufzuwecken, haben Sie versucht, -p
zu verwenden Option auf buffer
? Es sollte buffer
verursachen um Schreibvorgänge zu halten, bis der Puffer zu einem bestimmten Prozentsatz gefüllt ist. Möglicherweise benötigen Sie den -s
Möglichkeit auch große Stücke zu schreiben.
Update:D'oh, die Pipes zwischen den Befehlen schränken die Dinge immer noch ein. Versuchen Sie es vielleicht mit dem folgenden Adapterprogramm:
#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);
}
wie in:
adapter 1 (BIGSIZE) cmd1 | cmd2
oder sogar:
adapter 1 (BIGSIZE) cmd1 | adapter 1 (BIGSIZE) buffer [args] | cmd2
wenn cmd1
macht immer noch kleine Schreibvorgänge.
Basierend auf den Vorschlägen von DepressedDaniel und Stéphane Chazelas entschied ich mich für das, was einem Einzeiler am nächsten kam, den ich finden konnte:
function hugepipe {
perl -MFcntl -e 'fcntl(STDOUT, 1031, 1048576) or die $!; exec { $ARGV[0] } @ARGV or die $!' "[email protected]"
}
Dies ermöglicht:
hugepipe <command> | <command>
und die Pipe zwischen den beiden Befehlen wird die über fcntl
angegebene Kapazität haben im Perl-Skript.