сообщая, когда завершается процесс execl () - PullRequest
1 голос
/ 14 июня 2009

У меня есть приложение на c ++ с определенными элементами в очереди, которые затем будут обрабатываться скриптом Python. Я хочу, чтобы максимум 10 экземпляров скрипта Python работали. Я планирую использовать execl () для запуска процесса python. Есть ли способ сообщить, что процесс завершил свою работу, не передавая сообщение обратно родительскому процессу?

Ответы [ 2 ]

5 голосов
/ 14 июня 2009

execl не запускает процесс - он накладывает существующий процесс на другой исполняемый файл. fork запускает процесс и возвращает идентификатор дочернего процесса (он же pid) в родительский процесс (возвращает 0 дочернему процессу, так как ребенок знает, что это дочерний процесс, поэтому он может очистить вещи и exec). Используйте детские pid s, чтобы проверить, закончили ли они или нет, или отловите SIGCHLD , чтобы отследить это.

Я рекомендую SIGCHLD, чтобы вам не приходилось «опрашивать», чтобы увидеть, завершился ли какой-то процесс, но последний подход тоже не слишком сложен - просто выполняйте время от времени:

def whosdone(pids):
    nope = []
    done = []
    for pid in pids:
        try: os.kill(pid, 0)
        except OSError: nope.append(pid)
        else: done.append(pid)
    return done, nope

т.е. Вы можете периодически звонить по номеру done, pidslist = whosdone(pidslist) и делать с вашими PID все, что вам нужно. Конечно, когда вы fork используете идиому:

pid = os.fork()
if pid: # we're the parent process
  pidslist.append(pid)
else:   # we're the child process
  # clean things up, etc, then exec
0 голосов
/ 14 июня 2009

Если вы делаете это в C ++ под Unix / Linux, проверьте wait (), waitpid (), waitid () , wait3 () или wait4 () . Вы можете вызвать waitpid () NOHANG (опрос) или заблокировать его до завершения дочернего процесса. Pid (идентификатор процесса) - это значение, возвращаемое fork ().

Ранее я делал болезненный пример «трудного пути» для fork () (используя dup2 () для перенаправления ввода-вывода).

...