为什么在编写(unix)守护程序时需要关闭标准输入/输出/错误?
不仅应该关闭stdin、stdout和stderr,还应该关闭所有打开的文件。
摘自"UNIX环境中的高级编程",W.Richard Stevens,Addison Weseley,第18期印刷,1999年,第417页。
应关闭不需要的文件描述符。这可以防止后台进程打开可能从其父进程(可能是shell或其他进程)继承的任何描述符。
Mr。Stevens的建议是获得最大的文件描述符,并关闭所有达到该值的文件。
引用的章节是关于"守护进程"的。请注意,在编写守护进程时,关闭文件描述符仅为五分之一。
您不必肯定地关闭标准输出/error,但您必须确定您的守护进程(和子进程)要写入的位置。将输出重定向到日志文件是一种常见的做法。
关闭标准输入是必需的,这样守护进程(和/或子进程)就不会在尝试从用户读取某些输入时陷入困境。
但是,如果要使用setsid()
将守护进程与控制TTY分离,则标准输入/输出/错误将是无效。