2014-09-12 31 views
3

用戶進程使用3個文件描述符與終端進行通信。該終端被視爲unix中的文件(例如/dev/tty),並且還具有文件描述符,主要次要編號以供內核識別。所以內核通過終端與用戶進程通信。另一種溝通方式是通過我們都知道的系統調用。用戶進程,終端和內核之間的通信

假設用戶進程正在等待輸入(例如:enter two numbers: _ _)。當我們按下鍵盤上的和時,鍵盤緩衝區被填滿,與鍵盤相關聯的設備驅動程序將識別它並將在其等待隊列中喚醒進程。那麼這個數據如何(即12)對用戶進程有效?這將通過終端我猜。

另外如果重定向輸出會發生什麼,例如$ ./a.out > file?我已經使用isatty()進行了檢查,該過程不與任何終端關聯。那麼內核將如何與用戶進程交互?假設我的程序需要鍵盤輸入。

+0

此終端本身是由內核特殊處理。有進程組,並且組的前臺進程獲取控制檯輸入。你可以使用[屏幕](http://linux.die.net/man/1/screen)等東西給幾個程序的前景。除了終端的性質,我不明白你的問題是什麼,沒有多少重複? – 2014-09-15 14:39:20

回答

1

當你的程序調用輸入功能,例如:

nread = read(FILENO_STDIN, buffer, sizeof(buffer)); 

「系統調用」製成的內核。此內核例程確保您傳遞給它的緩衝區位於程序的地址空間中,然後將終端設備內核緩衝區中的字符(不超過您傳入的大小)複製到您提供的緩衝區中,並返回給您的計數那些。

如果文件描述符(arg 1)指向一個打開的文件 - 數據來自文件系統的內核緩衝區(可能需要先從實際設備複製到那裏),那麼會發生類似的情況。

+0

我沒有使用任何閱讀功能我的用戶進程。我想知道鍵盤緩衝區中的數據是如何通過終端進入用戶進程的。我在我的程序中使用scanf。 我已經看到某個地方,scanf反過來調用讀取功能。那麼read函數的參數如何與scanf映射?緩衝區地址可以是變量的地址(即&x),但是讀取函數中的大小參數呢?它將如何計算。 – 2014-09-15 09:36:26

+0

如果內核直接將鍵盤緩衝區數據複製到用戶空間那麼數據如何在終端上出現。例如:輸入兩個整數:_ _。當我給出輸入時,它不應該出現在終端上,而應該直接複製到變量地址(在用戶空間中)。我想知道如何在終端上顯示數據以及如何複製到用戶空間變量地址。 Plz不要忽略終端部分。我想知道這個機制。 謝謝 – 2014-09-15 09:43:56

+0

@debendranathtiwary'scanf()'不會在內部調用'read()'函數。 – iqstatic 2014-09-15 12:02:30

0

高水平的回答你的問題是,你有

User process <> Kernel <> Terminal Driver 

在一些系統終端驅動程序可能是內核的一部分。在其他情況下,它是在內核模式下執行的獨立代碼(很好的區別)。

當某人按下某個鍵時,它會觸發由驅動程序處理的系統中斷。在這裏,有兩件事情會發生,取決於內核如何告訴驅動程序行爲或如何實現驅動程序。

1)驅動程序可以將擊鍵存儲在緩衝區中;或者 2)驅動程序每次獲得按鍵時都可以通知內核。

內核可以與過程相互作用在許多方面,這取決於系統和過程是如何配置的終端:

1)內核可以什麼也不做與來自終端的數據,直到處理要求它。該進程提供一個緩衝區,內核從其內部緩衝區(或驅動程序的緩衝區)複製數據。 2)內核可以向進程發送軟件中斷(例如,Windows或VMS)。在這種情況下,該進程將預先向內核提供一個緩衝區,以便將數據複製到內核。 3)內核可以將一個事件排隊到進程將不得不查詢的進程。

關於您的部分問題,重定向完全在內核之外進行管理。的應用程序(通常是一個命令行shell)通常解釋

./a.out > file 

通過

1) Open FILE. 
2) Create a new process where the standard output is the handle to FILE. 
3) Run a.out in that process. 
+0

謝謝。 ./a.out>文件不與終端分離(因爲isatty失敗) 但是 ./a.out <文件與終端關聯(如isatty成功) 這種不同的行爲如何? – 2014-09-15 10:27:09

相關問題