Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Нет никакой связи между дочерним процессом и его родителем. Они могут знать каждый, другие обрабатывают идентификатор, но нет никакого трудного соединения между ними. Что Вы говорите о процесс висячей строки . И это - беспокойство уровня ОС. Значение любого решения является, вероятно, зависимым платформы.
О единственной вещи я могу думать, должен иметь дочернюю проверку ее родительское состояние периодически, выходя если завершение работы родителя. Я не думаю, что это было бы всем этим надежным все же.
Поскольку Вы нашли, что операционная система позволяет Вам обходить эту проблему. Вместо этого создайте ресурс, совместно использованный обоими процессами. Когда родитель прерывает ресурс, ребенок реагирует путем закрытия. Например:
Создают поток с серверной стороной, сокет TCP/IP в принимает режим на родителе на случайном высоком порте числа. Когда ребенок запустит, передайте номер порта в качестве параметра (переменная среды, запись базы данных, безотносительно). Имейте его, создают поток и открытый тот сокет. Потока находится на сокете навсегда. Если соединение когда-нибудь отбрасывает, имейте дочерний выход.
или
Создают поток на родителе, который постоянно обновляет дату обновления на файле. (Как часто зависит от того, сколько гранулярности между уничтожением и завершают работу Вас потребность.) У ребенка есть поток, который контролирует время обновления того же файла. Если это не обновляет после определенного интервала, автоматически завершает работу.
В то время как Вы не можете защитить от трудного аварийного прекращения работы (например, 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);
Попытайтесь отправить сигнал уничтожения в дочерний процесс от родителя, когда родитель остановится
Для сингла дочерние процессы можно управлять этим путем инвертирования дочерних/родительских отношений. См. мой ответ к более позднему воплощению этого вопроса.