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()(而不是线程、子进程等)的同时,这可能吗?
使用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 中工作。