告诉execl()进程何时退出

时间:2009-06-13 22:01:40

标签: c++ unix os.execl

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

如果您在unix / linux下使用C ++执行此操作,请查看wait(), waitpid(), waitid()wait3(), or wait4()。您可以调用waitpid()NOHANG(轮询)或阻止它直到子进程完成。 Pid(process-id)是fork().

返回的值

I did a painful "hard way" example of fork() earlier (using dup2() to re-route IO).