Очевидно, вам нужно обновить VirtualBox до 4.2, иначе он не будет работать
Это сильно зависит от того, что 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-файла первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.
Это сильно зависит от того, что 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-файла первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.
Это сильно зависит от того, что 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-файла первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.
Это сильно зависит от того, что 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-файла первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.
Это сильно зависит от того, что program1
. Программное обеспечение должно иметь возможность обрабатывать (или игнорировать) сигнал SIGPIPE
. program1
будет отвечать за обработку ошибки - если программное обеспечение является открытым исходным кодом, вы должны понимать, что происходит, или если оно ловушки / обнаруживает сигнал SIGPIPE
. Если программное обеспечение не делает ничего особенного с потоками, оно, скорее всего, завершит выполнение перед передачей результатов. Я попытался показать небольшой пример, используя два сценария php.
#! / Usr / bin / env php & lt;? Php @unlink ('program1 .вне'); for ($ i = 0; $ i & lt; 10; $ i ++) {// Это касается либо буфера, либо того, кто следующий в канале echo $ i. PHP_EOL; // Поместите все в файл, чтобы мы могли видеть, что на самом деле Program1 сделал file_put_contents ('program1.out', $ i. PHP_EOL, FILE_APPEND); } // Все сделано! Отключите файл file_put_contents ('program1.out', 'Fin', FILE_APPEND);
#! / usr / bin / env php & lt;? php // Мы принимаем входные данные и просто перенаправляем их на program2.out // но для того, чтобы сделать это забавно, я нахожу ошибку на полпути через //, потому что я злой, как @unlink ('program2.out'); $ pipe_input = file ("php: // stdin"); $ pipe_total = count ($ pipe_input); $ stop = rand (0, $ pipe_total - 1); echo «Я остановлюсь на $ stop». PHP_EOL; foreach ($ pipe_input as $ key = & gt; $ input) {if ($ key == $ stop) {file_put_contents ('program2.out', 'Dead!', FILE_APPEND); умирают (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 для первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.
Это сильно зависит от того, что program1
. Программное обеспечение должно иметь возможность обрабатывать (или игнорировать) сигнал SIGPIPE
. program1
будет отвечать за обработку ошибки - если программное обеспечение является открытым исходным кодом, вы должны понимать, что происходит, или если оно ловушки / обнаруживает сигнал SIGPIPE
. Если программное обеспечение не делает ничего особенного с потоками, оно, скорее всего, завершит выполнение перед передачей результатов. Я попытался показать небольшой пример, используя два сценария php.
#! / Usr / bin / env php & lt;? Php @unlink ('program1 .вне'); for ($ i = 0; $ i & lt; 10; $ i ++) {// Это касается либо буфера, либо того, кто следующий в канале echo $ i. PHP_EOL; // Поместите все в файл, чтобы мы могли видеть, что на самом деле Program1 сделал file_put_contents ('program1.out', $ i. PHP_EOL, FILE_APPEND); } // Все сделано! Отключите файл file_put_contents ('program1.out', 'Fin', FILE_APPEND);
#! / usr / bin / env php & lt;? php // Мы принимаем входные данные и просто перенаправляем их на program2.out // но для того, чтобы сделать это забавно, я нахожу ошибку на полпути через //, потому что я злой, как @unlink ('program2.out'); $ pipe_input = file ("php: // stdin"); $ pipe_total = count ($ pipe_input); $ stop = rand (0, $ pipe_total - 1); echo «Я остановлюсь на $ stop». PHP_EOL; foreach ($ pipe_input as $ key = & gt; $ input) {if ($ key == $ stop) {file_put_contents ('program2.out', 'Dead!', FILE_APPEND); умирают (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 для первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.
Это сильно зависит от того, что program1
. Программное обеспечение должно иметь возможность обрабатывать (или игнорировать) сигнал SIGPIPE
. program1
будет отвечать за обработку ошибки - если программное обеспечение является открытым исходным кодом, вы должны понимать, что происходит, или если оно ловушки / обнаруживает сигнал SIGPIPE
. Если программное обеспечение не делает ничего особенного с потоками, оно, скорее всего, завершит выполнение перед передачей результатов. Я попытался показать небольшой пример, используя два сценария php.
#! / Usr / bin / env php & lt;? Php @unlink ('program1 .вне'); for ($ i = 0; $ i & lt; 10; $ i ++) {// Это касается либо буфера, либо того, кто следующий в канале echo $ i. PHP_EOL; // Поместите все в файл, чтобы мы могли видеть, что на самом деле Program1 сделал file_put_contents ('program1.out', $ i. PHP_EOL, FILE_APPEND); } // Все сделано! Отключите файл file_put_contents ('program1.out', 'Fin', FILE_APPEND);
#! / usr / bin / env php & lt;? php // Мы принимаем входные данные и просто перенаправляем их на program2.out // но для того, чтобы сделать это забавно, я нахожу ошибку на полпути через //, потому что я злой, как @unlink ('program2.out'); $ pipe_input = file ("php: // stdin"); $ pipe_total = count ($ pipe_input); $ stop = rand (0, $ pipe_total - 1); echo «Я остановлюсь на $ stop». PHP_EOL; foreach ($ pipe_input as $ key = & gt; $ input) {if ($ key == $ stop) {file_put_contents ('program2.out', 'Dead!', FILE_APPEND); умирают (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 для первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.
Это сильно зависит от того, что program1
. Программное обеспечение должно иметь возможность обрабатывать (или игнорировать) сигнал SIGPIPE
. program1
будет отвечать за обработку ошибки - если программное обеспечение является открытым исходным кодом, вы должны понимать, что происходит, или если оно ловушки / обнаруживает сигнал SIGPIPE
. Если программное обеспечение не делает ничего особенного с потоками, оно, скорее всего, завершит выполнение перед передачей результатов. Я попытался показать небольшой пример, используя два сценария php.
#! / Usr / bin / env php & lt;? Php @unlink ('program1 .вне'); for ($ i = 0; $ i & lt; 10; $ i ++) {// Это касается либо буфера, либо того, кто следующий в канале echo $ i. PHP_EOL; // Поместите все в файл, чтобы мы могли видеть, что на самом деле Program1 сделал file_put_contents ('program1.out', $ i. PHP_EOL, FILE_APPEND); } // Все сделано! Отключите файл file_put_contents ('program1.out', 'Fin', FILE_APPEND);
#! / usr / bin / env php & lt;? php // Мы принимаем входные данные и просто перенаправляем их на program2.out // но для того, чтобы сделать это забавно, я нахожу ошибку на полпути через //, потому что я злой, как @unlink ('program2.out'); $ pipe_input = file ("php: // stdin"); $ pipe_total = count ($ pipe_input); $ stop = rand (0, $ pipe_total - 1); echo «Я остановлюсь на $ stop». PHP_EOL; foreach ($ pipe_input as $ key = & gt; $ input) {if ($ key == $ stop) {file_put_contents ('program2.out', 'Dead!', FILE_APPEND); умирают (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 для первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.
ffmpeg
обрабатывает SIGPIPE
. Обходным путем было бы иметь ffmpeg
pipe это STDERR
для файла и вашего хвоста скрипта php или chunk / обрабатывать файл таким образом, чтобы у вас не было длинных файлов php, не совсем оптимизированы для долгого выполнения.
– Marco Ceppi♦
27 April 2011 в 18:06
в
для выполнения php. :) Я действительно хочу отключить ffmpeg, если что-то происходит во время выполнения log-скрипта, так как я хочу, чтобы выполнение было в известном состоянии. Но вы многое разъяснили, спасибо. :)
– Max
27 April 2011 в 18:16
Труба будет сломана, и программа, записывающая в трубу, получит сигнал SIGPIPE.
Из GLIBC:
SIGPIPE Сломанная труба. Если вы используете каналы или FIFO, вам необходимо создать приложение, чтобы один процесс открыл канал для чтения, прежде чем начнется запись. Если процесс чтения никогда не запускается или неожиданно заканчивается, запись в канал или FIFO вызывает сигнал SIGPIPE. Если SIGPIPE заблокирован, обработан или проигнорирован, нарушивший вызов не работает с EPIPE.Короткий ответ заключается в том, что program1 умирает.
program1 получает сигнал SIGPIPE, когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прекращение программы, поэтому по большей части program1 будет просто прекращено.
Труба будет сломана, и программа, записывающая в трубу, получит сигнал SIGPIPE.
Из GLIBC:
SIGPIPE Сломанная труба. Если вы используете каналы или FIFO, вам необходимо создать приложение, чтобы один процесс открыл канал для чтения, прежде чем начнется запись. Если процесс чтения никогда не запускается или неожиданно заканчивается, запись в канал или FIFO вызывает сигнал SIGPIPE. Если SIGPIPE заблокирован, обработан или проигнорирован, нарушивший вызов не работает с EPIPE.Короткий ответ заключается в том, что program1 умирает.
program1 получает сигнал SIGPIPE, когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прекращение программы, поэтому по большей части program1 будет просто прекращено.
Труба будет сломана, и программа, записывающая в трубу, получит сигнал SIGPIPE.
Из GLIBC:
SIGPIPE Сломанная труба. Если вы используете каналы или FIFO, вам необходимо создать приложение, чтобы один процесс открыл канал для чтения, прежде чем начнется запись. Если процесс чтения никогда не запускается или неожиданно заканчивается, запись в канал или FIFO вызывает сигнал SIGPIPE. Если SIGPIPE заблокирован, обработан или проигнорирован, нарушивший вызов не работает с EPIPE.Короткий ответ заключается в том, что program1 умирает.
program1 получает сигнал SIGPIPE, когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прекращение программы, поэтому по большей части program1 будет просто прекращено.
Труба будет сломана, и программа, записывающая в трубу, получит сигнал SIGPIPE.
Из GLIBC:
SIGPIPE Сломанная труба. Если вы используете каналы или FIFO, вам необходимо создать приложение, чтобы один процесс открыл канал для чтения, прежде чем начнется запись. Если процесс чтения никогда не запускается или неожиданно заканчивается, запись в канал или FIFO вызывает сигнал SIGPIPE. Если SIGPIPE заблокирован, обработан или проигнорирован, нарушивший вызов не работает с EPIPE.Короткий ответ заключается в том, что program1 умирает.
program1 получает сигнал SIGPIPE, когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прекращение программы, поэтому по большей части program1 будет просто прекращено.
Короткий ответ: program1
умирает.
program1
получает сигнал SIGPIPE
, когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прервать программу, поэтому по большей части program1
будет просто прекращено.
Труба будет сломана, а программа, записывающая в трубу, получит сигнал SIGPIPE.
Из GLIBC :
SIGPIPE Broken труба. Если вы используете каналы или FIFO, вам необходимо создать приложение, чтобы один процесс открыл канал для чтения, прежде чем начнется запись. Если процесс чтения никогда не запускается, или неожиданно завершается , запись в трубку или FIFO вызывает сигнал SIGPIPE. Если SIGPIPE заблокирован, обработан или проигнорирован, нарушающий вызов не работает с EPIPE.
blockquote>
Короткий ответ: program1
умирает.
program1
получает сигнал SIGPIPE
, когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прервать программу, поэтому по большей части program1
будет просто прекращено.
Труба будет сломана, а программа, записывающая в трубу, получит сигнал SIGPIPE.
Из GLIBC :
SIGPIPE Broken труба. Если вы используете каналы или FIFO, вам необходимо создать приложение, чтобы один процесс открыл канал для чтения, прежде чем начнется запись. Если процесс чтения никогда не запускается, или неожиданно завершается , запись в трубку или FIFO вызывает сигнал SIGPIPE. Если SIGPIPE заблокирован, обработан или проигнорирован, нарушающий вызов не работает с EPIPE.
blockquote>
Короткий ответ: program1
умирает.
program1
получает сигнал SIGPIPE
, когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прекращение программы, поэтому по большей части программа program1
будет просто прекращена.
Труба будет сломана, а программа, записывающая в трубу, получит сигнал SIGPIPE.
Из GLIBC :
SIGPIPE Broken труба. Если вы используете каналы или FIFO, вам необходимо создать приложение, чтобы один процесс открыл канал для чтения, прежде чем начнется запись. Если процесс чтения никогда не запускается, или неожиданно завершается , запись в трубку или FIFO вызывает сигнал SIGPIPE. Если SIGPIPE заблокирован, обработан или проигнорирован, нарушающий вызов не работает с EPIPE.
blockquote>
Короткий ответ: program1
умирает.
program1
получает сигнал SIGPIPE
, когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прервать программу, поэтому по большей части program1
будет просто прекращено.