Unix 达尔文:如何在不杀死子进程的情况下杀死父进程?
在OS X 10.4/5/6上:Unix 达尔文:如何在不杀死子进程的情况下杀死父进程?,unix,macos,bsd,Unix,Macos,Bsd,在OS X 10.4/5/6上: 我有一个生成子进程的父进程。我想杀死父母而不是孩子。可能吗?我可以在任何一个应用程序上修改源。< /p> < p>如果父是一个shell,并且想启动一个长时间运行的进程,然后注销,请考虑 NOHUP(1)< /代码>或弃用< /代码> .< 如果控制子对象的编码,则可以捕获SIGHUP并以某种非默认方式处理它(例如完全忽略它)。阅读signal(3)和sigaction(2)手册页以获取相关帮助。无论哪种方式,在StackOverflow上都存在一些问题,有很好
我有一个生成子进程的父进程。我想杀死父母而不是孩子。可能吗?我可以在任何一个应用程序上修改源。< /p> < p>如果父是一个shell,并且想启动一个长时间运行的进程,然后注销,请考虑<代码> NOHUP(1)< /代码>或<代码>弃用< /代码> .<
如果控制子对象的编码,则可以捕获SIGHUP并以某种非默认方式处理它(例如完全忽略它)。阅读
signal(3)
和sigaction(2)
手册页以获取相关帮助。无论哪种方式,在StackOverflow上都存在一些问题,有很好的帮助。正如NSD所问,这实际上取决于它是如何产生的。例如,如果您使用的是shell脚本,则可以使用nohup
命令来运行子脚本
如果您使用的是fork/exec
,那么它会稍微复杂一些,但不会太复杂
从
这是有史以来写得最好的书之一。它非常详细地介绍了这些主题
UNIX环境中的高级编程,第二版(Addison-Wesley Professional Computing Series)(平装本)
ISBN-10:0321525949ISBN-13:978-0321525949
亚马逊五星评论(我给它6条)。在re:voting for ServerFault中。我就是看不出来。如果超级用户需要了解
nohup(1)
,或者如果是关于子进程中的信号捕获和处理,请留在这里。@NSD:父应用程序调用系统(“命令行”)。这两个应用程序都在普通用户的帐户中运行@杜邦:对不起,我不知道那个把戏。Unix是我的第二语言:)我应该提到父应用程序是一个C程序,而不是shell。父应用程序不是shell,它是一个调用system()的C应用程序。有解决办法吗?哦。。。对不起,家长不是空壳。这是一个C应用程序调用系统()。我可以控制这两个应用程序的源代码,但我不知道如何防止父母的死亡杀死孩子。
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()