首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >'IOError:[Errno 9]在后台进程中调用子进程时文件描述符错误

'IOError:[Errno 9]在后台进程中调用子进程时文件描述符错误
EN

Stack Overflow用户
提问于 2017-12-15 05:05:34
回答 1查看 1.9K关注 0票数 4
代码语言:javascript
复制
if args.daemon:
    pid = os.fork()
    if pid > 0:
        sys.exit(0)

    os.close(0)
    os.close(1)
    os.close(2)

main()


def main():
    # some code
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

仅当作为守护进程调用main时,我才得到IOError: errno9(派生进程并关闭stdin/stdout/stderr

我怀疑是因为关闭了那些管道,但如果我不这样做,我的程序就不会返回。有没有办法在守护进程中执行子进程?

EN

回答 1

Stack Overflow用户

发布于 2017-12-15 11:03:14

我更改了代码:

代码语言:javascript
复制
if args.daemon:
    pid = os.fork()
    if pid > 0:
        sys.exit(0)
    os.close(0)
    os.close(1)
    os.close(2)

至:

代码语言:javascript
复制
 if args.daemon:
    stdin = '/dev/null'
    stdout = '/dev/null'
    stderr = '/dev/null'

    try:
        pid = os.fork()
        if pid > 0:
            # exit first parent
            sys.exit(0)
    except OSError, e:
        sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
        sys.exit(1)

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

    # do second fork
    try:
        pid = os.fork()
        if pid > 0:
            # exit from second parent
            sys.exit(0)
    except OSError, e:
        sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))
        sys.exit(1)

    # redirect standard file descriptors
    sys.stdout.flush()
    sys.stderr.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())

子进程不再引发IOError

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47822021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档