我正在編寫一個應該通過stdin讀取輸入的程序,所以我有以下結構。如何檢查我的程序是否有數據傳入它
FILE *fp=stdin;
但這只是掛,如果用戶沒有任何管道進入程序,我怎麼能檢查,如果用戶實際上管道數據到我的程序像
gunzip -c file.gz |./a.out #should work
./a.out #should exit program with nice msg.
感謝
我正在編寫一個應該通過stdin讀取輸入的程序,所以我有以下結構。如何檢查我的程序是否有數據傳入它
FILE *fp=stdin;
但這只是掛,如果用戶沒有任何管道進入程序,我怎麼能檢查,如果用戶實際上管道數據到我的程序像
gunzip -c file.gz |./a.out #should work
./a.out #should exit program with nice msg.
感謝
由於您使用的文件的指針,您必須同時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
設置爲給您漂亮的顏色,它將關閉顏色,如果您將其標準輸出到另一個程序。
將stdin傳遞給select()或poll()會告訴你輸入是否在等待。在很多操作系統下,你還可以判斷stdin是否是tty或管道。
編輯:我看到我將不得不強調也是部分的tty測試。 fifo不是tty,但可能沒有準備好無限期的輸入。
我認爲OP只是想覆蓋命令行和奇蹟 - 爲什麼 - 「掛起」的情況。可能試圖解決PEBKAC錯誤。坐在那裏等待FIFO或其他管道就沒問題。 – 2010-04-02 11:56:33
嘗試「man isatty」,我認爲該功能會告訴你,如果你正在與用戶交談。
使用isatty
來檢測stdin是否來自終端而不是重定向。
查看函數「isatty」 - 如果STDIN是終端,則可以跳過讀取。如果它不是終端,那麼您將獲取數據傳輸或重定向,並且您可以閱讀直到EOF。
你使用select()獲得的另一個選項是設置從標準輸入讀取的超時(相對於標準輸入的第一次讀取或從標準輸入的連續讀取)。使用在stdin請參閱選擇
有關代碼示例:
對於記錄,程序沒有掛;它只是在等待輸入。如果您發送EOF(大多數平臺上的Ctrl-D),則將其解釋爲輸入提前結束。 – greyfade 2010-04-02 02:59:12