fork、exec和disown

您好,我有一个有关分叉过程的疑问 ATM,我有一些我想重写的代码 OS.System(" CD〜 && exec" + CMD +"&DISOWN") 我想删除此操作系统电话 def fork_exec_disown(cmd,dir ="〜"): 如果OS.Fork()== 0: OS.Chdir(OS.Path..path.expander(dir)) os.setsid() os.umask(0) 如果OS.Fork(): sys.exit(0) cmd = cmd.split() OS.EXECVP(CMD [0],CMD) 但是我不确定这具有相同的行为. 需要第二个叉子吗? 我认为要分离生成过程 我已经在OS Doc,OS.SetsID中找到,我想我必须使用它. 我说错了还是这很简单 def fork_exec_disown(cmd,dir ="〜"): 如果OS.Fork()== 0: OS.Chdir(OS.Path..path.expander(dir)) cmd = cmd.split() OS.EXECVP(CMD [0],CMD) 我的操作系统电话的好替换 谢谢你

# 回答1

>>>>>" benoit" == benoit dejean 写道: Benoit>您好,我有一个有关分叉流程ATM的疑问,我有 Benoit>我想重写的一些代码 Benoit> OS.System(" CD〜 && exec" + CMD +"&DISOWN") Benoit>我想删除此操作系统. benoit> def fork_exec_disown(cmd,dir ="〜"): benoit>如果OS.Fork()== 0: benoit> os.chdir(os.path..xpanduser(dir))os.setsid()os.umask(0) benoit> if os.fork():sys.exit(0) benoit> cmd = cmd.split()os.execvp(cmd [0],cmd) Benoit>,但我不确定这具有相同的行为. 是个 Benoit>第二叉需要吗? 我认为是为了分离生成过程 Benoit>在OS Doc,OS.SetsID中找到了,我想我必须使用它. Benoit>我是错的还是这很简单 benoit> def fork_exec_disown(cmd,dir ="〜"): benoit> if os.fork()== 0:os.chdir(os.path.expanduser(dir))cmd = benoit> cmd.split()os.execvp(cmd [0],cmd) Benoit>我的操作系统电话的好替代品 您可以做到这一点,但是如果您运行PS,您会注意到所有过程都会得到 进入Z(僵尸),状态. 迟早您将有叉子() 给您"暂时不可用的资源"错误,因为 过程编号用完了. 使用"双分叉"技术,您可以避免 通过在最后添加等待: def fork_exec_disown(cmd,dir ="〜"): 如果OS.Fork()== 0: 如果OS.Fork(): sys.exit(0) OS.Chdir(OS.Path..path.expander(dir)) cmd = cmd.split() OS.EXECVP(CMD [0],CMD) OS.Wait() 等待只会等待孩子,而不是孙子. 如果您不这样做 让您开始积累僵尸. 在某些操作系统中,您可以避免 通过操纵Sigchld的信号处理程序来双分叉开销(因此 它具有旗帜sa_nocldwait,并具有处理程序sig_ign),但这是更多 平台依赖于叉(). 问候, 以撒.
# 回答2

Le Sun,2004年2月8日22:22:37 +0800,以撒到écrit*: 你能告诉我更多关于这个吗? 因为我真的很感兴趣.我想拥有最好/最快的 替换OS.System 谢谢你
# 回答3

>>>>>" benoit" == benoit dejean 写道: Benoit> Le Sun,2004年2月8日22:22:37 +0800,以撒到écrit*: Benoit>您能告诉我更多Abo ut? 因为我真的是 Benoit>感兴趣.我想拥有最好/最快的替代品 Benoit> OS.System 例如,在我的Linux盒中,以下内容不会留下任何僵尸: 导入操作系统 导入时间 导入信号 signal.signal(signal.sigchld,signal.sig_ign) def fork_exec_disown(cmd,dir ="〜"): 如果OS.Fork()== 0: OS.Chdir(OS.Path..path.expander(dir)) cmd = cmd.split() OS.EXECVP(CMD [0],CMD) 对于我在Xrange(1000)中: fork_exec_disown(" true") 时间. 另一方面,效果是全球的,所以一旦您做到了 希望您可以等待已经死亡的过程. 例如, 遵循不再工作: Trackback(最近的最新电话): 文件" ",第1行,在? 文件" ",第6行,在f中 Oserror:[Errno 10]没有孩子流程 因此,双分叉具有其优点,因为它是每个孩子而不是 每个父母. 而且,现代操作系统实际上是相当有效地做叉子(). 问候, 以撒.
# 回答4

>因此,双分叉具有其优点,因为它是每个孩子而不是 谢谢,我会保留双向.

标签: python

添加新评论