При подключении трубопровода от одной программы к другой, что происходит с исходной программой, если программа, получающая выход, убита?

Очевидно, вам нужно обновить VirtualBox до 4.2, иначе он не будет работать

1
задан 27 April 2011 в 17:04

32 ответа

Это сильно зависит от того, что program1. Программное обеспечение должно иметь возможность обрабатывать (или игнорировать) сигнал SIGPIPE. program1 будет отвечать за обработку ошибки - если программное обеспечение является открытым исходным кодом, вы должны понимать, что происходит, или если оно ловушки / обнаруживает сигнал SIGPIPE. Если программное обеспечение не делает ничего особенного с потоками, оно, скорее всего, завершит выполнение перед передачей результатов. Я попытался сделать небольшой пример, чтобы показать точку, используя два сценария php.

program1

#!/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);

program2

#!/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-файла первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.

3
ответ дан 25 May 2018 в 21:53
  • 1
    Спасибо за Ваш ответ. :) Ваш пример лишь частично относится к моей фактической проблеме, о которой я действительно не обсуждал в вопросе (но вариант использования, вероятно, более распространен). Я передаю ffmpeg error / info / progress output в php-скрипт, который я читаю char с помощью char, в то время как я думаю, что ваш пример читается до EOF. Поскольку ffmpeg будет работать в течение нескольких часов, мне нужно точно знать, что происходит. Я думаю, что это прекращено SIGPIPE. :) – Max 27 April 2011 в 17:55
  • 2
    @Max В этом случае это зависит от того, как ffmpeg обрабатывает SIGPIPE. Обходным путем было бы иметь ffmpeg канал STDERR в файле, а ваш хвост скрипта php или chunk / обрабатывать файл так, чтобы у вас не было длинных файлов php, которые не совсем оптимизированы для долгого выполнения. – Marco Ceppi♦ 27 April 2011 в 18:06
  • 3
    true, но я не использую PHP, это веб-контекст. Я использую at для выполнения php. :) Я действительно хочу отключить ffmpeg, если что-то происходит во время выполнения log-скрипта, так как я хочу, чтобы выполнение было в известном состоянии. Но вы многое разъяснили, спасибо. :) – Max 27 April 2011 в 18:16

Это сильно зависит от того, что program1. Программное обеспечение должно иметь возможность обрабатывать (или игнорировать) сигнал SIGPIPE. program1 будет отвечать за обработку ошибки - если программное обеспечение является открытым исходным кодом, вы должны понимать, что происходит, или если оно ловушки / обнаруживает сигнал SIGPIPE. Если программное обеспечение не делает ничего особенного с потоками, оно, скорее всего, завершит выполнение перед передачей результатов. Я попытался сделать небольшой пример, чтобы показать точку, используя два сценария php.

program1

#!/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);

program2

#!/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-файла первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.

3
ответ дан 25 July 2018 в 22:08

Это сильно зависит от того, что program1. Программное обеспечение должно иметь возможность обрабатывать (или игнорировать) сигнал SIGPIPE. program1 будет отвечать за обработку ошибки - если программное обеспечение является открытым исходным кодом, вы должны понимать, что происходит, или если оно ловушки / обнаруживает сигнал SIGPIPE. Если программное обеспечение не делает ничего особенного с потоками, оно, скорее всего, завершит выполнение перед передачей результатов. Я попытался сделать небольшой пример, чтобы показать точку, используя два сценария php.

program1

#!/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);

program2

#!/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-файла первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.

3
ответ дан 2 August 2018 в 03:38

Это сильно зависит от того, что program1. Программное обеспечение должно иметь возможность обрабатывать (или игнорировать) сигнал SIGPIPE. program1 будет отвечать за обработку ошибки - если программное обеспечение является открытым исходным кодом, вы должны понимать, что происходит, или если оно ловушки / обнаруживает сигнал SIGPIPE. Если программное обеспечение не делает ничего особенного с потоками, оно, скорее всего, завершит выполнение перед передачей результатов. Я попытался сделать небольшой пример, чтобы показать точку, используя два сценария php.

program1

#!/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);

program2

#!/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-файла первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.

3
ответ дан 4 August 2018 в 19:40

Это сильно зависит от того, что program1 . Программное обеспечение должно иметь возможность обрабатывать (или игнорировать) сигнал SIGPIPE . program1 будет отвечать за обработку ошибки - если программное обеспечение является открытым исходным кодом, вы должны понимать, что происходит, или если оно ловушки / обнаруживает сигнал SIGPIPE . Если программное обеспечение не делает ничего особенного с потоками, оно, скорее всего, завершит выполнение перед передачей результатов. Я попытался показать небольшой пример, используя два сценария php.

program1

  #! / 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);   

program2

  #! / 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 для первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.

3
ответ дан 6 August 2018 в 03:45

Это сильно зависит от того, что program1 . Программное обеспечение должно иметь возможность обрабатывать (или игнорировать) сигнал SIGPIPE . program1 будет отвечать за обработку ошибки - если программное обеспечение является открытым исходным кодом, вы должны понимать, что происходит, или если оно ловушки / обнаруживает сигнал SIGPIPE . Если программное обеспечение не делает ничего особенного с потоками, оно, скорее всего, завершит выполнение перед передачей результатов. Я попытался показать небольшой пример, используя два сценария php.

program1

  #! / 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);   

program2

  #! / 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 для первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.

3
ответ дан 7 August 2018 в 21:40

Это сильно зависит от того, что program1 . Программное обеспечение должно иметь возможность обрабатывать (или игнорировать) сигнал SIGPIPE . program1 будет отвечать за обработку ошибки - если программное обеспечение является открытым исходным кодом, вы должны понимать, что происходит, или если оно ловушки / обнаруживает сигнал SIGPIPE . Если программное обеспечение не делает ничего особенного с потоками, оно, скорее всего, завершит выполнение перед передачей результатов. Я попытался показать небольшой пример, используя два сценария php.

program1

  #! / 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);   

program2

  #! / 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 для первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.

3
ответ дан 10 August 2018 в 09:54

Это сильно зависит от того, что program1 . Программное обеспечение должно иметь возможность обрабатывать (или игнорировать) сигнал SIGPIPE . program1 будет отвечать за обработку ошибки - если программное обеспечение является открытым исходным кодом, вы должны понимать, что происходит, или если оно ловушки / обнаруживает сигнал SIGPIPE . Если программное обеспечение не делает ничего особенного с потоками, оно, скорее всего, завершит выполнение перед передачей результатов. Я попытался показать небольшой пример, используя два сценария php.

program1

  #! / 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);   

program2

  #! / 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 для первой программы имеет полный набор чисел, а второй содержит только набор из них, потому что он был убит.

3
ответ дан 13 August 2018 в 16:13
  • 1
    Спасибо за Ваш ответ. :) Ваш пример лишь частично относится к моей фактической проблеме, о которой я действительно не обсуждал в вопросе (но вариант использования, вероятно, более распространен). Я передаю ffmpeg error / info / progress output в php-скрипт, который я читаю char с помощью char, в то время как я думаю, что ваш пример читается до EOF. Поскольку ffmpeg будет работать в течение нескольких часов, мне нужно точно знать, что происходит. Я думаю, что это прекращено SIGPIPE. :) – Max 27 April 2011 в 17:55
  • 2
    @Max В этом случае это зависит от того, как ffmpeg обрабатывает SIGPIPE . Обходным путем было бы иметь ffmpeg pipe это STDERR для файла и вашего хвоста скрипта php или chunk / обрабатывать файл таким образом, чтобы у вас не было длинных файлов php, не совсем оптимизированы для долгого выполнения. – Marco Ceppi♦ 27 April 2011 в 18:06
  • 3
    true, но я не использую PHP, это веб-контекст. Я использую в для выполнения php. :) Я действительно хочу отключить ffmpeg, если что-то происходит во время выполнения log-скрипта, так как я хочу, чтобы выполнение было в известном состоянии. Но вы многое разъяснили, спасибо. :) – Max 27 April 2011 в 18:16

Труба будет сломана, и программа, записывающая в трубу, получит сигнал SIGPIPE.

Из GLIBC:

SIGPIPE Сломанная труба. Если вы используете каналы или FIFO, вам необходимо создать приложение, чтобы один процесс открыл канал для чтения, прежде чем начнется запись. Если процесс чтения никогда не запускается или неожиданно заканчивается, запись в канал или FIFO вызывает сигнал SIGPIPE. Если SIGPIPE заблокирован, обработан или проигнорирован, нарушивший вызов не работает с EPIPE.
1
ответ дан 25 May 2018 в 21:53
  • 1
    Что такое действие по умолчанию для получения сигнала SIGPIPE? Например, если приложение не обрабатывает его напрямую, что-то еще придет и уничтожит его, или он просто продолжит беспроблемную работу? – Oli♦ 27 April 2011 в 17:26
[Не d0] Ничего. Данные идут в / dev / null. Постскриптум О, да, программа получит сигнал, но это не значит, что придется закрыть.

0
ответ дан 25 May 2018 в 21:53

Короткий ответ заключается в том, что program1 умирает.

program1 получает сигнал SIGPIPE, когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прекращение программы, поэтому по большей части program1 будет просто прекращено.

0
ответ дан 25 May 2018 в 21:53
[Не d0] Ничего. Данные идут в / dev / null. Постскриптум О, да, программа получит сигнал, но это не значит, что придется закрыть.

0
ответ дан 25 July 2018 в 22:08

Труба будет сломана, и программа, записывающая в трубу, получит сигнал SIGPIPE.

Из GLIBC:

SIGPIPE Сломанная труба. Если вы используете каналы или FIFO, вам необходимо создать приложение, чтобы один процесс открыл канал для чтения, прежде чем начнется запись. Если процесс чтения никогда не запускается или неожиданно заканчивается, запись в канал или FIFO вызывает сигнал SIGPIPE. Если SIGPIPE заблокирован, обработан или проигнорирован, нарушивший вызов не работает с EPIPE.
1
ответ дан 25 July 2018 в 22:08
  • 1
    Что такое действие по умолчанию для получения сигнала SIGPIPE? Например, если приложение не обрабатывает его напрямую, что-то еще придет и уничтожит его, или он просто продолжит беспроблемную работу? – Oli♦ 27 April 2011 в 17:26

Короткий ответ заключается в том, что program1 умирает.

program1 получает сигнал SIGPIPE, когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прекращение программы, поэтому по большей части program1 будет просто прекращено.

0
ответ дан 25 July 2018 в 22:08
[Не d0] Ничего. Данные идут в / dev / null. Постскриптум О, да, программа получит сигнал, но это не значит, что придется закрыть.

0
ответ дан 2 August 2018 в 03:38

Труба будет сломана, и программа, записывающая в трубу, получит сигнал SIGPIPE.

Из GLIBC:

SIGPIPE Сломанная труба. Если вы используете каналы или FIFO, вам необходимо создать приложение, чтобы один процесс открыл канал для чтения, прежде чем начнется запись. Если процесс чтения никогда не запускается или неожиданно заканчивается, запись в канал или FIFO вызывает сигнал SIGPIPE. Если SIGPIPE заблокирован, обработан или проигнорирован, нарушивший вызов не работает с EPIPE.
1
ответ дан 2 August 2018 в 03:38
  • 1
    Что такое действие по умолчанию для получения сигнала SIGPIPE? Например, если приложение не обрабатывает его напрямую, что-то еще придет и уничтожит его, или он просто продолжит беспроблемную работу? – Oli♦ 27 April 2011 в 17:26

Короткий ответ заключается в том, что program1 умирает.

program1 получает сигнал SIGPIPE, когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прекращение программы, поэтому по большей части program1 будет просто прекращено.

0
ответ дан 2 August 2018 в 03:38
[Не d0] Ничего. Данные идут в / dev / null. Постскриптум О, да, программа получит сигнал, но это не значит, что придется закрыть.

0
ответ дан 4 August 2018 в 19:40

Труба будет сломана, и программа, записывающая в трубу, получит сигнал SIGPIPE.

Из GLIBC:

SIGPIPE Сломанная труба. Если вы используете каналы или FIFO, вам необходимо создать приложение, чтобы один процесс открыл канал для чтения, прежде чем начнется запись. Если процесс чтения никогда не запускается или неожиданно заканчивается, запись в канал или FIFO вызывает сигнал SIGPIPE. Если SIGPIPE заблокирован, обработан или проигнорирован, нарушивший вызов не работает с EPIPE.
1
ответ дан 4 August 2018 в 19:40
  • 1
    Что такое действие по умолчанию для получения сигнала SIGPIPE? Например, если приложение не обрабатывает его напрямую, что-то еще придет и уничтожит его, или он просто продолжит беспроблемную работу? – Oli♦ 27 April 2011 в 17:26

Короткий ответ заключается в том, что program1 умирает.

program1 получает сигнал SIGPIPE, когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прекращение программы, поэтому по большей части program1 будет просто прекращено.

0
ответ дан 4 August 2018 в 19:40

Короткий ответ: program1 умирает.

program1 получает сигнал SIGPIPE , когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прервать программу, поэтому по большей части program1 будет просто прекращено.

0
ответ дан 6 August 2018 в 03:45

Труба будет сломана, а программа, записывающая в трубу, получит сигнал SIGPIPE.

Из GLIBC :

SIGPIPE Broken труба. Если вы используете каналы или FIFO, вам необходимо создать приложение, чтобы один процесс открыл канал для чтения, прежде чем начнется запись. Если процесс чтения никогда не запускается, или неожиданно завершается , запись в трубку или FIFO вызывает сигнал SIGPIPE. Если SIGPIPE заблокирован, обработан или проигнорирован, нарушающий вызов не работает с EPIPE.

1
ответ дан 6 August 2018 в 03:45
[Не d0] Ничего. Данные идут в / dev / null. Постскриптум О, да, программа получит сигнал, но это не значит, что придется закрыть.

0
ответ дан 6 August 2018 в 03:45

Короткий ответ: program1 умирает.

program1 получает сигнал SIGPIPE , когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прервать программу, поэтому по большей части program1 будет просто прекращено.

0
ответ дан 7 August 2018 в 21:40
[Не d0] Ничего. Данные идут в / dev / null. Постскриптум О, да, программа получит сигнал, но это не значит, что придется закрыть.

0
ответ дан 7 August 2018 в 21:40

Труба будет сломана, а программа, записывающая в трубу, получит сигнал SIGPIPE.

Из GLIBC :

SIGPIPE Broken труба. Если вы используете каналы или FIFO, вам необходимо создать приложение, чтобы один процесс открыл канал для чтения, прежде чем начнется запись. Если процесс чтения никогда не запускается, или неожиданно завершается , запись в трубку или FIFO вызывает сигнал SIGPIPE. Если SIGPIPE заблокирован, обработан или проигнорирован, нарушающий вызов не работает с EPIPE.

1
ответ дан 7 August 2018 в 21:40

Короткий ответ: program1 умирает.

program1 получает сигнал SIGPIPE , когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прекращение программы, поэтому по большей части программа program1 будет просто прекращена.

0
ответ дан 10 August 2018 в 09:54

Труба будет сломана, а программа, записывающая в трубу, получит сигнал SIGPIPE.

Из GLIBC :

SIGPIPE Broken труба. Если вы используете каналы или FIFO, вам необходимо создать приложение, чтобы один процесс открыл канал для чтения, прежде чем начнется запись. Если процесс чтения никогда не запускается, или неожиданно завершается , запись в трубку или FIFO вызывает сигнал SIGPIPE. Если SIGPIPE заблокирован, обработан или проигнорирован, нарушающий вызов не работает с EPIPE.

1
ответ дан 10 August 2018 в 09:54
[Не d0] Ничего. Данные идут в / dev / null. Постскриптум О, да, программа получит сигнал, но это не значит, что придется закрыть.

0
ответ дан 10 August 2018 в 09:54

Короткий ответ: program1 умирает.

program1 получает сигнал SIGPIPE , когда труба сломана. Программы, предназначенные для долговременных демонов, обычно обрабатывают сигнал и делают правильную очистку, но вашей типичной интерактивной программы нет. Действие по умолчанию - это прервать программу, поэтому по большей части program1 будет просто прекращено.

0
ответ дан 13 August 2018 в 16:13

Другие вопросы по тегам:

Похожие вопросы: