Остановка программы, если следующий процесс в конвейере был остановлен - PullRequest
3 голосов
/ 22 января 2010

когда я запускаю следующий конвейер:

cat my_large_file.txt | head | wc

процесс останавливается практически сразу. OK.

но когда я запускаю свою Java-программу

java MyProgramReadALargeFile my_large_file.txt | head | wc

вывод из 'wc' печатается в stdout, но java-программа все еще работает . Как он может обнаружить, что трубопровод был закрыт?

Спасибо

Ответы [ 3 ]

1 голос
/ 23 февраля 2010

Большинство утилит UNIX обращают внимание на SIGPIPE , который при получении указывает, что поток по каналу, в который пишет процесс, ничего не слушает на другом конце, поэтому нет необходимости продолжать работать.

Поиск чего-то вроде «java posix сигналов» приводит к некоторым библиотекам, которые могут позволить вам добавлять обработчики сигналов в ваш код Java.

1 голос
/ 22 января 2010

'head' закрывает поток после первых 10 строк, поэтому нормально, что Java все еще работает, пока завершены 'head' и 'wc'. Возможно, вы можете протестировать в своем Java-коде, если System.out все еще открыт, но я сомневаюсь, что это надежный метод. Вероятно, это зависит от реализации каналов ОС и реализации JVM System.out (действительно ли он закрывает поток или просто передает его в /dev/null).

(пробовали ли вы cat'ing достаточно большой файл и проверять, продолжает ли процесс 'cat' продолжаться и после завершения 'head'?)

0 голосов
/ 22 января 2010

Я сомневаюсь, что он закрывает System.out с точки зрения Java-прог. Он может перенаправлять в / dev / null, но головному руководителю будет проще прекратить прослушивание потока вывода программы Java, то есть exit ().

Вы можете посмотреть на источник 'cat', чтобы увидеть, выполняет ли он какое-либо обнаружение состояния выходного потока. Если это так, вам придется поместить подобный код в вашу программу MyProgramReadALargeFile. В противном случае головка может делать то, что не может обнаружить процесс, питающий трубу.

Если скорость, с которой заканчивается пример 'cat', является подозрительной, попробуйте выполнить

cat my_large_file.txt > /dev/null

и посмотрим, так ли быстро.

...