2017-08-02 63 views
1

介紹:我一直在關注K & R作爲我的指導建議。我遇到了下面的代碼,我一直在試圖找出背景中實際發生了什麼。o/s過程終端如何輸入C代碼?

代碼:

// Program to count lines, words and characters in input 

#include <stdio.h> 

#define IN 1  // inside a word 
#define OUT 0  // outside a word 

int main() 
{ 
    int c, nl, nw, nc, state; 

    state = 0; 
    nl = nw = nc = 0; 
    while ((c = getchar()) != EOF) 
      { 
       ++nc;   // increment newchar count 
       if (c == '\n') 
        ++nl;  // increment newline count 
       if (c == ' ' || c == '\n' || c == '\t') 
        state = OUT; 
       else if (state == OUT) 
       { 
        state = IN; 
        ++nw;  // increment newword count 
       } 
      } 

    printf("%d %d %d\n", nl, nw, nc); 
} 

問題:據我所知,在輸入輸入後,按Ctrl + d(Linux的/基於MAC OS)是需要插入EOF字符其中最後將代碼從while循環中打印出來,但是我無法弄清楚在我輸入輸入時背景中發生了什麼。 輸入是否正在同時處理,只是等待Ctrl + D(EOF字符)打印輸出,或者是在處理完Ctrl + D後處理所有輸入。

在前一種方式中,處理能力應該是平衡的,但後一種方式會一次將整個負載放在處理器上,這就是我想知道它是如何工作的原因。

+1

基本上你的問題是運行系統是如何工作的 –

+0

@IlyaBursov我的問題是,如何這個特殊的代碼將被處理編譯器,而不是操作系統的工作方式 –

+0

編譯器將生成對由操作系統提供的函數的調用,該函數可以通過符號向您發送符號,或者在您決定執行此操作時將內部緩衝區發送給您,所以是的,您的問題是操作系統如何工作 –

回答

2

正如評論者所指出的那樣,這個問題本質上是在詢問操​​作系統如何實現輸入和輸出,因爲你的調用很可能以系統調用(內核空間中的一個函數)結束。

操作系統如何在沒有緩衝的情況下實現這種調用的鳥瞰圖如下所示:操作系統將使您的線程處於等待狀態,並在CPU上運行其他任何事情。當按下某個鍵時,驅動程序會讓操作系統知道將決定將路由到哪裏,在這種情況下是您的程序。它會將程序從等待狀態喚醒,並從系統調用中返回關鍵代碼。

這裏的神奇之處在於處理器能夠在整個程序暫停時(等待時),執行其他操作並稍後恢復。

真正的操作系統將實現緩衝形式,也許在內核中,但也在標準庫中,在系統調用之上實現getchar()。將會有抽象層和重定向層。例如,在C標準中,輸入和輸出流被表示爲文件。

(我沒有操作系統專家,所以請糾正我,如果我做任何犯有嚴重錯誤。)

+1

謝謝。我明白。一個簡單而有效的答案 –