Это сильно зависит от того, что program1. Программное обеспечение должно иметь возможность обрабатывать (или игнорировать) сигнал SIGPIPE. program1 будет отвечать за обработку ошибки - если программное обеспечение является открытым исходным кодом, вы должны понимать, что происходит, или если оно ловушки / обнаруживает сигнал SIGPIPE. Если программное обеспечение не делает ничего особенного с потоками, оно, скорее всего, завершит выполнение перед передачей результатов. Я попытался сделать небольшой пример, чтобы показать точку, используя два сценария php.
#!/usr/bin/env php
<?php
@unlink('program1.out');
for( $i = 0; $i < 10; $i++ )
{
// This goes to either the buffer or whoever is next in the pipe
echo $i . PHP_EOL;
// Put everything in a file so we can see what Program1 actually did
file_put_contents('program1.out', $i . PHP_EOL, FILE_APPEND);
}
// All done! Cap off the file
file_put_contents('program1.out', 'Fin', FILE_APPEND);
#!/usr/bin/env php
<?php
// We're taking inputs and just redirecting them to program2.out
// but to make it fun I'll throw an error half way through
// because I'm malicious like that
@unlink('program2.out');
$pipe_input = file("php://stdin");
$pipe_total = count($pipe_input);
$stop = rand(0, $pipe_total - 1);
echo "I'll be stopping at $stop" . PHP_EOL;
foreach( $pipe_input as $key => $input )
{
if( $key == $stop )
{
file_put_contents('program2.out', 'Dead!', FILE_APPEND);
die(1);
}
file_put_contents('program2.out', $input, FILE_APPEND);
}
Когда вы выполняете ./program1 | ./program2, вы Я получаю два файла .out по одному для каждой программы. В приведенном примере я получил следующие файлы:
0
1
2
3
4
5
6
7
8
9
Fin
И для program2.out
0
1
2
3
4
Dead!
Первая программа выполнит и передаст ее содержимое ко второму. Вы заметите, что файл .out-файла первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.