如何获取双叉创建的守护进程的pid?

fal*_*ure 5 python unix fork daemon pid

我有一个通过双叉访问守护进程的简单方法:

    try:
        child = os.fork()
        if child > 0:
            sys.exit(0)
    except OSError:
        print("fork 1 failed")
        sys.exit(1)
    try:
        child = os.fork()
        if child > 0:
            sys.exit(0)
    except OSError:
        print("fork 2 failed")
        sys.exit(1)
    os.execvp(args[0], args) # what the daemon's supposed to be doing
Run Code Online (Sandbox Code Playgroud)

或者,这就是我之前所拥有的,但我怀疑它不正确:

child = os.fork()
if not child:
    secondchild = os.fork()
    if not secondchild:
        os.execvp(args[0], args)
    else:
        os._exit(0)
Run Code Online (Sandbox Code Playgroud)

我想在它断开连接的祖父进程中取回守护进程的进程 ID。在仍然使用 os.fork() 和 os.execvp()(而不是线程、子进程等)的同时,这可能吗?

fal*_*tru 4

使用os.pipe

import os
import sys

try:
    r, w = os.pipe()
    print('grandparent {}'.format(os.getpid()))
    child = os.fork()
    if child > 0:
        grandchild_pid = int(os.fdopen(r).readline().strip())
        print('grand child pid: {}'.format(grandchild_pid))
        sys.exit(0)
except OSError:
    print("fork 1 failed")
    sys.exit(1)
try:
    print('parent {}'.format(os.getpid()))
    child = os.fork()
    if child > 0:
        # Pass child (grandchild)'s pid to parent.
        os.write(w, '{}\n'.format(child)) 
        sys.exit(0)
except OSError:
    print("fork 2 failed")
    sys.exit(1)

print('child {}'.format(os.getpid()))
Run Code Online (Sandbox Code Playgroud)

更新

替换以下行:

os.write(w, '{}\n'.format(child))
Run Code Online (Sandbox Code Playgroud)

和:

os.write(w, '{}\n'.format(child).encode())
Run Code Online (Sandbox Code Playgroud)

使其在 Python 3.x 中工作。