2017-02-22 81 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

相关问题