在OS X 10.4 / 5/6上:
我有一个产生孩子的父进程。我想在不杀死孩子的情况下杀死父母。可能吗?我可以在任一应用程序上修改源代码。
答案 0 :(得分:5)
正如NSD所说,这实际上取决于它是如何产生的。例如,如果您使用的是shell脚本,则可以使用nohup
命令来运行子进程。
如果您使用的是fork/exec
,那么它会更复杂一些,但不会太多。
来自http://code.activestate.com/recipes/66012/
import sys, os
def main():
""" A demo daemon main routine, write a datestamp to
/tmp/daemon-log every 10 seconds.
"""
import time
f = open("/tmp/daemon-log", "w")
while 1:
f.write('%s\n' % time.ctime(time.time()))
f.flush()
time.sleep(10)
if __name__ == "__main__":
# do the UNIX double-fork magic, see Stevens' "Advanced
# Programming in the UNIX Environment" for details (ISBN 0201563177)
try:
pid = os.fork()
if pid > 0:
# exit first parent
sys.exit(0)
except OSError, e:
print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)
sys.exit(1)
# decouple from parent environment
os.chdir("/")
os.setsid()
os.umask(0)
# do second fork
try:
pid = os.fork()
if pid > 0:
# exit from second parent, print eventual PID before
print "Daemon PID %d" % pid
sys.exit(0)
except OSError, e:
print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
sys.exit(1)
# start the daemon main loop
main()
这是有史以来最好的书之一。它非常详细地介绍了这些主题。
UNIX环境下的高级编程,第二版(Addison-Wesley专业计算系列)(平装本)
ISBN-10:0321525949
ISBN-13:978-0321525949
5星亚马逊评论(我给它6)。
答案 1 :(得分:3)
如果父级是shell,并且您想要启动长时间运行的进程然后注销,请考虑nohup (1)
或disown
。
如果您控制子代码,您可以捕获SIGHUP并以某种非默认方式处理它(如完全忽略它)。阅读signal (3)
和sigaction (2)
手册页以获取相关帮助。无论哪种方式,StackOverflow上都有几个现有的问题,并提供了很好的帮助。