2011-07-01 56 views
3
#include <unistd.h> 
int main(int argc, char* argv[]) 
{ 
    char buf[500]; 
    read(0, buf, 5); 
    return 0; 
} 

stdin上面read 5個字符,但如果I輸入比5更多:這種行爲是由標準定義的嗎?

12345morethan5 
[[email protected] test]# morethan5 
-bash: morethan5: command not found 

其餘字符將被作爲外殼命令執行。

這種行爲是由標準定義的嗎?

+0

您可能會發現本節3.3.2一個有趣參閱http:/ /www.aosabook.org/en/bash.html – Joe

回答

5

排序:-)

您的程序讀取5個字符,就是這樣。不少,不多。其餘部分保留在終端緩衝區中,一旦C程序終止,就會發送到您的shell。

由於您使用read(),這是一種原始的系統調用,而不是任何的C STDIO緩衝替代的這種行爲不只是預期,但需要

從POSIX標準上read()

讀()函數應嘗試 從與打開的文件 描述符,fildes關聯的文件 讀nbyte字節,到緩衝器 通過指向BUF。

...

成功完成後,其中 nbyte大於0,閱讀()應 大關更新 的st_atime的字段中指定文件,並須返回讀取的字節數 。 這個數字永遠不會是 大於nbyte。

...

成功完成後,讀() [XSI] [選項開始]和PREAD() [選項結束]應返回指示 字節數的 非負整數其實閱讀。

I.e. read()從不從文件描述符中讀取比請求更多的字節。

related part上端子:

它沒有,但是,需要在一次讀 整個行;可以在 read()中請求任何數量的 字節,甚至一個字節,而不會丟失信息。

...

最後過程以關閉一個終端設備的文件須導致任何輸出要被髮送到的設備和任何輸入被丟棄。

注意:通常情況下,您的shell仍然會爲終端打開文件描述符,直到您結束會話。

+0

任何引用說,這是**必需的**? –

+1

@Je Rog:如果需要的話,我認爲它將在POSIX規範中說明終端的工作方式。也就是說,當有一個程序從終端獲取輸入,但不被該程序讀取時發生按鍵事件。 I/O的規範至多會定義輸入未被緩衝,因此程序確實不會讀取這些字符。 –

+0

@Steve傑索普,@Je羅格:你去那裏:-) – thkala

0

這與任何標準無關,它取決於你的運行時寫什麼標準輸入。您的運行時會使標準輸入可用於您的程序,該程序會從中讀取一些字節並退出,然後剩餘的字節由運行時本身處理 - 如果您可以配置它以在分支進程後清除所有文件描述符,那麼您也許可以防止這種行爲,但是這將嚴重妨礙其中大部分依靠一個進程的輸入連接到另一個進程的輸出標準的命令行工作流程...

+0

在這種情況下,有一個相關標準:(僞)終端的POSIX規範和/或shell行爲的X/Open規範。 – zwol

+0

@Zack:謝謝!很高興知道。 –