python forked进程没有用os.execlp执行

时间:2015-06-07 16:50:43

标签: python macos exec fork

我有这个简单的python脚本应该分叉新进程,然后每个执行命令使用os.execlp,但执行只发生一次。我很好奇是否有时间问题正在阻止额外的叉子执行:

import os

for n in range(5):
    PID = os.fork()
    if PID == 0: #the child...
        print("This child's PID is: %s" % os.getpid())
        os.execlp('open','-n','-a','Calculator')
        # os.popen('open -n -a Calculator')
        # os._exit(0)
    else:
        print("new child forked: %d" % PID)

为此,OS X中的“open -n -a Appname”命令启动指定应用程序的新实例,因此上面的代码应该用“open”命令替换forked进程,这应该运行5次。但是,它只运行一次,因此只打开一个Calculator实例。尽管如此,父母列出了分叉的5个子PID。

如果我注释掉os.execlp行并取消注释它后面的os.popen和os._exit行,那么这样就可以了,并且子进程全部运行“open”命令;但是,我想知道为什么使用execlp(或execvp和其他类似变体)替换分叉进程的方法不起作用?很明显,子进程正在运行,因为我可以使用管道来运行“打开”命令。

这是使用python 3.4.3。

1 个答案:

答案 0 :(得分:1)

在可执行文件之后的第一个参数是arg [0],它按照惯例是可执行文件的名称。如果您有符号链接,这将确定程序的行为,这很有用。在您的情况下,您将程序命名为'-n',而真实参数仅为-aCalculator。所以你必须重复'open'

os.execlp('open', 'open', '-n', '-a', 'Calculator')