2017-08-02 84 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

相關問題