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