1

我有一个 C++ 应用程序,其中包含队列中的某些项目,然后这些项目将由 python 脚本处理。我希望它最多运行 10 个 python 脚本实例。我打算使用 execl() 来启动 python 进程,有没有办法告诉进程已经退出而不必将消息传递回父进程?

4

2 回答 2

5

execl不启动进程——它用另一个可执行文件覆盖现有进程。fork 确实启动了一个进程 - 并将子进程的 id(aka pid)返回给父进程(将 0 返回给子进程,这就是子进程知道它是子进程的方式,因此它可以清理和exec)。使用孩子的pids 来检查他们是否完成,或者捕获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() 返回的值。

我之前做了一个痛苦的 fork() 示例(使用 dup2() 重新路由 IO)。

于 2009-06-14T03:14:21.373 回答