Как я могу заставить дочерний процесс выходить, когда родитель делает?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

46
задан Community 23 May 2017 в 11:47
поделиться

5 ответов

Нет никакой связи между дочерним процессом и его родителем. Они могут знать каждый, другие обрабатывают идентификатор, но нет никакого трудного соединения между ними. Что Вы говорите о процесс висячей строки . И это - беспокойство уровня ОС. Значение любого решения является, вероятно, зависимым платформы.

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

20
ответ дан sblundy 26 November 2019 в 20:28
поделиться

Поскольку Вы нашли, что операционная система позволяет Вам обходить эту проблему. Вместо этого создайте ресурс, совместно использованный обоими процессами. Когда родитель прерывает ресурс, ребенок реагирует путем закрытия. Например:

Создают поток с серверной стороной, сокет TCP/IP в принимает режим на родителе на случайном высоком порте числа. Когда ребенок запустит, передайте номер порта в качестве параметра (переменная среды, запись базы данных, безотносительно). Имейте его, создают поток и открытый тот сокет. Потока находится на сокете навсегда. Если соединение когда-нибудь отбрасывает, имейте дочерний выход.

или

Создают поток на родителе, который постоянно обновляет дату обновления на файле. (Как часто зависит от того, сколько гранулярности между уничтожением и завершают работу Вас потребность.) У ребенка есть поток, который контролирует время обновления того же файла. Если это не обновляет после определенного интервала, автоматически завершает работу.

3
ответ дан jmucchiello 26 November 2019 в 20:28
поделиться

В то время как Вы не можете защитить от трудного аварийного прекращения работы (например, SIGKILL на Unix), можно защитить от других сигналов, которые заставляют родительский процесс закрываться (например, SIGINT) и очищать дочерний процесс. Можно выполнить это посредством использования рычагов завершения работы: см. Runtime#addShutdownHook, а также связанное ТАК вопрос здесь .

Ваш код мог бы выглядеть примерно так:

String[] command;
final Process childProcess = new ProcessBuilder(command).start();

Thread closeChildThread = new Thread() {
    public void run() {
        childProcess.destroy();
    }
};

Runtime.getRuntime().addShutdownHook(closeChildThread); 
37
ответ дан Community 26 November 2019 в 20:28
поделиться

Попытайтесь отправить сигнал уничтожения в дочерний процесс от родителя, когда родитель остановится

0
ответ дан 26 November 2019 в 20:28
поделиться

Для сингла дочерние процессы можно управлять этим путем инвертирования дочерних/родительских отношений. См. мой ответ к более позднему воплощению этого вопроса.

2
ответ дан Community 26 November 2019 в 20:28
поделиться
Другие вопросы по тегам:

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