我有一个 C++ 应用程序,其中包含队列中的某些项目,然后这些项目将由 python 脚本处理。我希望它最多运行 10 个 python 脚本实例。我打算使用 execl() 来启动 python 进程,有没有办法告诉进程已经退出而不必将消息传递回父进程?
问问题
643 次
2 回答
5
execl
不启动进程——它用另一个可执行文件覆盖现有进程。fork
确实启动了一个进程 - 并将子进程的 id(aka 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
于 2009-06-13T22:10:45.020 回答
0
如果您在 unix/linux 下的 C++ 中执行此操作,请查看wait()、waitpid()、waitid()、wait3() 或 wait4()。您可以调用 waitpid() NOHANG(轮询)或让它阻塞直到子进程完成。Pid (process-id) 是fork() 返回的值。
于 2009-06-14T03:14:21.373 回答