Когда вы передаете два процесса по каналу и уничтожаете один из них на «выходе» канала, первый процесс используется для получения сигнала «Сломанный канал», который обычно завершает его также. Например. работает
$> do_something_intensive | less
, а затем выход из less , используемый для немедленного возврата вас к адаптивной оболочке SuSE8 или более ранних версий.
когда я пытаюсь сделать это сегодня, do_something_intensive , очевидно, все еще работает, пока я не убью его вручную. Кажется, что-то изменилось (glib? Shell?), Что заставляет программу игнорировать «сломанные каналы» ...
У кого-нибудь из вас есть намеки на это? как восстановить прежнее поведение? почему он был изменен (или почему всегда существовала множественная семантика)?
edit : дальнейшие тесты (с использованием strace) показывают, что "SIGPIPE" генерируется , но программа не прерывается. Простой
#include <stdio.h>
int main()
{
while(1) printf("dumb test\n");
exit(0);
}
будет продолжаться бесконечно
--- SIGPIPE (Broken pipe) @ 0 (0) ---
write(1, "dumb test\ndumb test\ndumb test\ndu"..., 1024) = -1 EPIPE (Broken pipe)
когда меньше убито. Я мог бы точно запрограммировать обработчик сигнала в своей программе и убедиться, что он завершается, но я больше ищу переменную среды или опцию оболочки, которая заставляла бы программы завершаться на SIGPIPE
отредактируйте снова : похоже, что это проблема, специфичная для tcsh (bash обрабатывает ее правильно) и зависит от терминала (Eterm 0.9.4)