2010-04-02 34 views
7

我正在編寫一個應該通過stdin讀取輸入的程序,所以我有以下結構。如何檢查我的程序是否有數據傳入它

FILE *fp=stdin; 

但這只是掛,如果用戶沒有任何管道進入程序,我怎麼能檢查,如果用戶實際上管道數據到我的程序像

gunzip -c file.gz |./a.out #should work 
./a.out #should exit program with nice msg. 

感謝

+0

對於記錄,程序沒有掛;它只是在等待輸入。如果您發送EOF(大多數平臺上的Ctrl-D),則將其解釋爲輸入提前結束。 – greyfade 2010-04-02 02:59:12

回答

8

由於您使用的文件的指針,您必須同時isatty()fileno()做到這一點:

#include <unistd.h> 
#include <stdio.h> 

int main(int argc, char* argv[]) 
{ 
    FILE* fp = stdin; 

    if(isatty(fileno(fp))) 
    { 
     fprintf(stderr, "A nice msg.\n"); 
     exit(1); 
    } 

    /* carry on... */ 
    return 0; 
} 

其實,這是很長的路要走。簡短的方法是不使用文件指針:

#include <unistd.h> 

int main(int argc, char* argv[]) 
{ 
    if(isatty(STDIN_FILENO)) 
    { 
     fprintf(stderr, "A nice msg.\n"); 
     exit(1); 
    } 

    /* carry on... */ 
    return 0; 
} 

幾個標準的Unix程序會檢查它們以修改它們的行爲。例如,如果您有ls設置爲給您漂亮的顏色,它將關閉顏色,如果您將其標準輸出到另一個程序。

3

將stdin傳遞給select()或poll()會告訴你輸入是否在等待。在很多操作系統下,你還可以判斷stdin是否是tty或管道。

編輯:我看到我將不得不強調也是部分的tty測試。 fifo不是tty,但可能沒有準備好無限期的輸入。

+0

我認爲OP只是想覆蓋命令行和奇蹟 - 爲什麼 - 「掛起」的情況。可能試圖解決PEBKAC錯誤。坐在那裏等待FIFO或其他管道就沒問題。 – 2010-04-02 11:56:33

3

嘗試「man isatty」,我認爲該功能會告訴你,如果你正在與用戶交談。

2

使用isatty來檢測stdin是否來自終端而不是重定向。

1

查看函數「isatty」 - 如果STDIN是終端,則可以跳過讀取。如果它不是終端,那麼您將獲取數據傳輸或重定向,並且您可以閱讀直到EOF。

相關問題