Как я могу отправить сигнал процессу popen'ed в Perl? - PullRequest
2 голосов
/ 04 октября 2010

Я написал простой Perl-скрипт, который будет запускаться в цикле while и завершаться всякий раз, когда в этот Perl-скрипт отправляется какой-либо сигнал.Я написал программу ac, которая создает поток, используя pthread_create(), и в своей процедуре запуска она использует popen для выполнения сценария Perl:

popen("/usr/bin/perl myprog.pl");

Я использую sigtrap в сценарии Perlпоймать любой сигнал, который он получает.Теперь я хочу отправить сигнал (TERM) из моей программы на C в этот процесс Perl, выполняемый потоком.Как я могу это сделать?Есть ли способ отправить сигнал popen 'ed процессам.Пожалуйста, дайте мне знать, если нужно больше деталей.

Ответы [ 2 ]

8 голосов
/ 04 октября 2010

Отправка сигналов обычно работает с использованием kill.Чтобы иметь возможность убить, обычно требуется идентификатор процесса, PID, процесса, о котором вы хотите сообщить.

popen этого не дает.Однако есть несколько альтернатив:

Вы можете использовать PID 0, который будет отправлять ваш сигнал каждому процессу в группе процессов.Если у вас есть только один родительский процесс, порождающий один дочерний процесс с использованием popen, то использование kill(0, your_signal) может быть одним из способов.

Другой способ - это заставить дочерний процесс передавать свой PID обратнородительский процесс, например, просто выводя это в одну строку как первое после запуска.

В Perl это будет выглядеть как

print $$, "\n";

процесс, который сделалpopen может затем прочитать эту строку из полученного дескриптора файла и извлечь из нее полезный pid, используя strtol или atoi, и сохранить его для использования с kill позже, после прочтения фактического выводаего дочерний процесс.

Если по какой-либо причине ни один из этих подходов не подходит для вашей проблемы, вы, вероятно, хотите прекратить использовать popen в целом и делать большую часть того, что он делает вручную, что наиболее важно fork ing, так как именно это даст вам PID для использования для последующей отправки сигналов.

2 голосов
/ 04 октября 2010

popen() не дает вам никакого доступа к PID дочернего процесса, который вам нужен, чтобы сигнализировать об этом.

Вам нужно будет выполнить всю работу popen() самостоятельно (настроить каналы, форк, exec, wait).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...