2016-11-22 52 views
0

我目前正在編寫一個應用程序,允許用戶通過telnet訪問遠程計算機的bash shell。該應用程序是在遠程機器上運行的telnet服務器。我管道從Telnet流輸出到一個bash的過程,我產生了像這樣:通過標準輸入發送SIGINT

char *execArgs[] = {"/bin/bash", "-i", 0}; 
execv(execArgs[0], execArgs); 

我可以做幾乎所有你能在一個正常的殼呢;鍵入命令,退格等。但是,我遇到問題使用CTRL + C來查殺任務。當我從telnet端收到一個CTRL + C序列時,它會以[0xFF] [0xF8]形式出現。該FF放遠程登錄到IAC模式(允許它解釋命令),以及F8告訴我的程序發送一個ETX(0×03):

char tmpchar = 3; 
retval = write(outfd[1], &tmpchar, 1); 
fflush(fstdin); 

哪裏outfd是流進bash進程。但是,我不認爲0x03被解釋爲一個SIGINT信號,或者至少它不會消除當前正在運行的任務。爲什麼會這樣?

+0

你應該發送一個'SIGINT',而不是'^ C'!你使用pty與'bash'還是管道交談,或者是什麼? –

+0

我正在使用管道 – crocboy

回答

2

由於您沒有終端,您不能指望任何終端功能。因此,如果您向管道發送^C,則^C將從管道中排出。您可以使用kill向該流程發送SIGINT

但是如果使用終端與bash交談,你會更好!殼期望與終端交互,而不是管道。打入你的系統man pty開始學習如何做到這一點。

pty(7)手冊頁:

甲僞終端(有時縮寫爲「PTY」)是一對,其提供一個雙向通信信道的虛擬角色設備。該頻道的一端稱爲主人;另一端稱爲奴隸。 僞終端的從機端提供了一個與傳統終端完全相同的接口。需要連接到終端的 進程可以打開僞終端的從終端,然後由打開主終端的程序驅動。

寫在主端上的任何東西都提供給 從端上的進程,就好像它是在終端上輸入的一樣。例如,將中斷 字符(通常爲control-C)寫入主設備將導致爲連接到從設備的前臺進程組生成中斷信號(SIGINT) 。相反,寫入僞終端從站 末端的任何內容都可以通過連接到主端的進程讀取。 (ssh(1),rlogin(1),telnet(1)),終端仿真程序, 腳本(1),screen(1)和expect(1)等應用程序使用的僞終端爲 。

這就是你想要的。

+0

很好的答案,謝謝! – crocboy

相關問題