2011-05-06 77 views
6

我想我不清楚getty/agetty/mgetty程序在linux/unix機器上的功能是什麼。我可以開始一個tty殼像這樣的東西:Python TTY控制

TTY = '/dev/tty3' 

cpid = os.fork() 
if cpid == 0: 
    os.closerange(0, 4) 
    sys.stdin = open(TTY, 'r') 
    sys.stdout = open(TTY, 'w') 
    sys.stderr = open(TTY, 'w') 
    os.execv(('/bin/bash',), ('bash',)) 

..和如果我切換到tty3上,有一個shell運行 - 但有些按鍵被忽略/永遠不會被髮送到外殼。 shell知道TTY設置不正確,因爲bash會說'無法打開tty,禁止作業控制'

我知道'termios'模塊具有更改TTY上的設置的功能,這就是'tty'模塊使用,但我無法找到正確設置TTY並啓動shell的python示例。我覺得它應該是簡單的,但我不知道在哪裏看。

查看源爲* etty方案沒有幫助我 - C相類似希臘給我: -/

也許我只是沒有尋找合適的條款?任何人在過去都用Python取代了* etty程序,並有他們願意分享的解釋?

感謝我的應酬基本問題:)

回答

4

我可以看到你錯過了至少兩件事情 - 可能還有更多:

首先,你需要收盤後致電setsid()在子進程舊的標準輸入/標準輸出,並在打開新的TTY之前。這有兩個重要的事情 - 它使新過程成爲新會話的領導者,並將其與其先前的控制終端分離(僅關閉該終端不足而不足)。這意味着當你打開新的tty時,它將成爲控制終端,這正是你想要的。

其次,您需要設置TERM環境變量以匹配新的tty。

+1

os.setsid()只需要它!我知道這一定很容易。謝謝。 – tMC 2011-05-06 01:38:48

0

你應該看看* tty *程序的來源,看看他們做了什麼。

我的猜測是,他們大多發出一堆ioctl命令來將終端初始化爲程序通常期望的模式(例如,登錄等)。然而他們中的一些人也可能會提示輸入用戶名(而不是密碼;登錄是這樣做的)。