2017-02-22 122 views
1

我目前正在寫一個C++程序的使用方式:只允許一個文件被重定向到標準輸入

[prog] - - - - - - - - - - - - read from stdin 
[prog] [filename] - - - - - - will test and open file 
[prog] < [filename] - - - - - will redirect the filename to stdin 

我已經寫代碼來捕獲參數太多,而且一切正常,但如果用戶試圖

[prog] < [filename] [filename] 

它會打開第二個文件名。

如何防止發生這種情況。感謝您的考慮。

+2

簡而言之,你不能。 –

回答

3

進程可以看到的任何東西都可以權威地推斷shell是否明確地將進程的標準輸入重定向爲遠離默認值。

但是一個進程可以在POSIX平臺上運行時做出非常有教育的猜測,其中isatty()返回給定文件描述符是否附加到交互式終端的指示。所以,你可以檢查是否isatty(0)(標準輸入文件描述符#0);如果是這樣,這意味着進程的標準輸入仍然附加到交互式鍵盤輸入,並且未被重定向。

這不是100%萬無一失。仍然有可能通過精心設計的歌舞表演,並且使用僞tty設備將管道附加到與交互式終端無法區分的流程標準輸入到流程,但輸入真的來自其他一些設備來源,但這是非常罕見的,並且對於您典型的花園應用,isatty()應該足夠。所以,你的main()可以檢查isatty(0),如果是的話,這是一個很好的跡象表明輸入沒有被重定向。

但是,請注意,如果isatty(0)不是真的,標準輸入可能會被重定向,但是需要額外的偵測來確定它是管道,純文件還是別的東西。

因此,您的總體計劃是:檢查您的argv是否指定文件名。如果是這樣,如果isatty(0),那麼你有兩個可能的輸入文件來處理。

+0

有趣。我要檢查isatty()並測試它,我沒聽說過。 – TheTotalJim

+0

這適用於我的需求,但我會考慮到這不是100%萬無一失的保證。 – TheTotalJim

1

如何防止發生這種情況。感謝您的考慮。

我不認爲你可以防止這種情況。用戶可以通過使用其他工具來連接文件,輕鬆規避您可能要施加的任何限制。例如,用戶可以輕鬆使用:

cat filename1 filename2 | program 
+0

Sam Varshavchik的答案讓我做一個測試用例來防止我描述的簡單情況,但是感謝這個信息。我會測試一下,看看會發生什麼。這是一個學校項目,所以我可能不需要防範你所描述的情況,但是如果我可以讓我的導師知道我爲這些特殊情況進行了測試,我肯定這不會是一件壞事。 – TheTotalJim

相關問題