我有这个简单的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。
答案 0 :(得分:1)
在可执行文件之后的第一个参数是arg [0],它按照惯例是可执行文件的名称。如果您有符号链接,这将确定程序的行为,这很有用。在您的情况下,您将程序命名为'-n'
,而真实参数仅为-a
和Calculator
。所以你必须重复'open'
:
os.execlp('open', 'open', '-n', '-a', 'Calculator')