2017-08-02 81 views
0

我正在开发一个简单的服务,绑定到一个端口,并产生一个PTY为应用程序,dup()荷兰国际集团STDINSTDOUTSTDERR到插座,使插座接管pty控制:如何强制pty.spawn()启动的应用程序完全退出?

prevOutFd = os.dup(1) 
prevInFd = os.dup(0) 
prevErrFd = os.dup(2) 
while 1: 
    #wait to accept a connection - blocking call 
    conn, addr = s.accept() 
    logging.info('Connected with ' + addr[0] + ':' + str(addr[1])) 
    # redirect stdout, stdin and stderr to socket fd 
    os.dup2(conn.fileno(),0) 
    os.dup2(conn.fileno(),1) 
    os.dup2(conn.fileno(),2) 
    p=pty.spawn("/usr/sbin/pppd") 
    # redirect stdout, stdin and stderr back to original fds 
    os.dup2(prevOutFd, 0) 
    os.dup2(prevInFd, 1) 
    os.dup2(prevErrFd, 2) 
    logging.info("Closing connection....") 
    conn.close() 

这工作得很好,除了当客户突然杀死连接。 服务器处理它只是罚款,而是催生了应用程序在系统中留下解散:

root 9820 0.1 0.0 0 0 ? Zs 16:19 0:00 [pppd] <defunct>

我认为,解决办法是要么等待应用程序完成或干净关闭它。 但是,pty似乎没有某种close()方法。

任何人都知道如何干净地关闭pty.spawn() ed应用程序?

回答

0

可以wait()已退出进程是这样​​的:

pty.spawn("cmd") # it returns nothing 
os.wait() 

您还可以设置一个SIGCHLD处理程序,以便退出子进程可以自动等待版。

def sig_child(signum, bt): 
    os.waitpid(-1, os.WNOHANG) 

signal.signal(SIGCHLD, sig_child) 

pty.spawn("cmd") 
+0

非常感谢! – user3158527

相关问题