gpt4 book ai didi

Python:守护进程时关闭文件描述符

转载 作者:行者123 更新时间:2023-11-28 18:49:33 26 4
gpt4 key购买 nike

我的应用程序中有这段代码:

def daemonize_process(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
'''
Fork the current process as a daemon (background process), redirecting
standard file descriptors

@param string stdin standard input file name
@param string stdout standard output file name
@param string stderr standard error file name
'''

# To transform a process in a daemon, it is necessary to fork, decouple from
# parent environment, fork again and close all opened file descriptors.

# do first fork
try:
pid = os.fork()
if pid > 0:
# exit from first parent process
# using os._exit() instead of sys.exit() in a child process after
# a fork is recommended by Python API docs
os._exit(0)
except OSError as e:
sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
sys.exit(1)

# decouple from parent environment
os.chdir("/")
os.umask(0)
os.setsid()

# do second fork
try:
pid = os.fork()
if pid > 0:
# exit from second parent process
# using os._exit() instead of sys.exit() in a child process after
# a fork is recommended by Python API docs
os._exit(0)
except OSError, e:
sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))
sys.exit(1)

# close all file descriptors
import resource
maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
if (maxfd == resource.RLIM_INFINITY):
maxfd = 1024

for fd in range(0, maxfd):
try:
os.close(fd)
except OSError:
sys.stderr.write("error closing file: (%d) %s\n" % (e.errno, e.strerror))
pass

# process is now daemonized, redirect standard file descriptors.
for f in sys.stdout, sys.stderr:
f.flush( )
si = file(stdin, 'r')
so = file(stdout, 'a+')
se = file(stderr, 'a+', 0)
os.dup2(si.fileno( ), sys.stdin.fileno( ))
os.dup2(so.fileno( ), sys.stdout.fileno( ))
os.dup2(se.fileno( ), sys.stderr.fileno( ))

在我在网络上看到的守护程序代码中,文件描述符在子进程中没有关闭。我为什么要这样做?在我看来,我可能想继续处理在 fork-detach-fork 过程之前我已经在处理的文件。

提前致谢。

最佳答案

为什么关闭文件描述符?通常你可以假设启动守护进程的进程知道它在做什么,并且会在 exec() 之前关闭它的文件描述符。

例如,如果您从 bash 运行,您将获得的唯一打开文件描述符是标准文件描述符,加上在 shell 中手动设置的任何重定向。

如果一个程序让文件描述符保持打开状态,那它就是错误的。无论如何,可以使用 FD_CLOEXEC 打开文件,这样它们将在 exec() 上自动关闭。

关于Python:守护进程时关闭文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15003074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com