原因
调用execv后会用一个新的process image 替换掉老的process image。文件描述符却不会被替换,也就是之前创建的文件描述符并不会被关闭(代码中负责关闭文件描述符的函数被替换了,来不及执行).
解决
每次execv前先给所有的fd添加上close-on-exec.
import psutil
p = psutil.Process()
# 0,1,2(stdin, stdout, stderr)不可关闭
for fd in range(3, p.num_fds()):
try:
flags = fcntl.fcntl(fd, fcntl.F_GETFD)
except IOError:
continue
fcntl.fcntl(fd, fcntl.F_SETFD, flags|fcntl.FD_CLOEXEC)