Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 达尔文:如何在不杀死子进程的情况下杀死父进程?_Unix_Macos_Bsd - Fatal编程技术网

Unix 达尔文:如何在不杀死子进程的情况下杀死父进程?

Unix 达尔文:如何在不杀死子进程的情况下杀死父进程?,unix,macos,bsd,Unix,Macos,Bsd,在OS X 10.4/5/6上: 我有一个生成子进程的父进程。我想杀死父母而不是孩子。可能吗?我可以在任何一个应用程序上修改源。< /p> < p>如果父是一个shell,并且想启动一个长时间运行的进程,然后注销,请考虑 NOHUP(1)< /代码>或弃用< /代码> .< 如果控制子对象的编码,则可以捕获SIGHUP并以某种非默认方式处理它(例如完全忽略它)。阅读signal(3)和sigaction(2)手册页以获取相关帮助。无论哪种方式,在StackOverflow上都存在一些问题,有很好

在OS X 10.4/5/6上:


我有一个生成子进程的父进程。我想杀死父母而不是孩子。可能吗?我可以在任何一个应用程序上修改源。< /p> < p>如果父是一个shell,并且想启动一个长时间运行的进程,然后注销,请考虑<代码> NOHUP(1)< /代码>或<代码>弃用< /代码> .<
如果控制子对象的编码,则可以捕获SIGHUP并以某种非默认方式处理它(例如完全忽略它)。阅读
signal(3)
sigaction(2)
手册页以获取相关帮助。无论哪种方式,在StackOverflow上都存在一些问题,有很好的帮助。

正如NSD所问,这实际上取决于它是如何产生的。例如,如果您使用的是shell脚本,则可以使用
nohup
命令来运行子脚本

如果您使用的是
fork/exec
,那么它会稍微复杂一些,但不会太复杂

这是有史以来写得最好的书之一。它非常详细地介绍了这些主题

UNIX环境中的高级编程,第二版(Addison-Wesley Professional Computing Series)(平装本)

ISBN-10:0321525949
ISBN-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()