只允许将一个文件重定向到stdin

时间:2017-02-22 03:38:30

标签: c++ parsing command-line

我目前正在编写一个带有用法的C ++程序:

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

我已编写代码来捕获太多参数,除了用户尝试

之外,一切正常
[prog] < [filename] [filename]

它会打开第二个文件名。

如何防止此情况发生。谢谢你的考虑。

2 个答案:

答案 0 :(得分:3)

流程可以通过权威的方式判断shell是否明确地将流程的标准输入重定向到默认值之外。

但是当在POSIX平台上运行时,进程可以做出非常有根据的猜测,其中isatty()返回指示给定文件描述符是否附加到交互式终端的指示。因此,您可以检查isatty(0)(标准输入文件描述符#0);如果是这样,这意味着进程的标准输入仍然附加到交互式键盘输入,并且尚未重定向。

这不是100%万无一失。仍然可以通过精心制作的歌舞例程,并使用伪tty设备将管道连接到过程的标准输入,该输入与交互式终端无法区分,直到过程,但输入确实来自其他一些来源,但这种情况非常罕见,对于典型的花园种类应用,isatty()应该足够了。因此,您的main()可以检查isatty(0),如果是,则表明输入尚未重定向。

但是,请注意,如果isatty(0)不正确,标准输入可能会被重定向,但需要进行额外的调查以确定它是管道,普通文件还是其他内容,也许

因此,您的整体游戏计划是:检查您的argv是否指定了文件名。如果是,如果isatty(0),则您有两个可能的输入文件要处理。

答案 1 :(得分:1)

  

如何防止此情况发生。谢谢你的考虑。

我认为你不能阻止这一点。用户可以通过使用其他工具来连接文件,轻松绕过您可能想要强加的任何此类限制。例如,用户可以轻松使用:

cat filename1 filename2 | program