Дарвин: как убить родительский процесс, не убивая ребенка? - PullRequest
0 голосов
/ 23 декабря 2009

В OS X 10.4 / 5/6:

У меня есть родительский процесс, который порождает ребенка. Я хочу убить родителя, не убивая ребенка. Является ли это возможным? Я могу изменить источник в любом приложении.

Ответы [ 2 ]

5 голосов
/ 23 декабря 2009

Как спросил НРД, это действительно зависит от того, как он создается. Например, если вы используете сценарий оболочки, вы можете использовать команду 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-звездочные обзоры Amazon (я бы дал 6).

3 голосов
/ 23 декабря 2009

Если родитель является оболочкой, и вы хотите запустить длительный процесс, а затем выйдите из системы, рассмотрите nohup (1) или disown.

Если вы управляете кодированием дочернего элемента, вы можете перехватывать SIGHUP и обрабатывать его не по умолчанию (например, игнорировать его напрямую). Прочтите справочные страницы signal (3) и sigaction (2) для получения справки. В любом случае есть несколько вопросов о StackOverflow с хорошей помощью.

...