我目前正在编写一个带有用法的C ++程序:
[prog] - - - - - - - - - - - - read from stdin
[prog] [filename] - - - - - - will test and open file
[prog] < [filename] - - - - - will redirect the filename to stdin
我已编写代码来捕获太多参数,除了用户尝试
之外,一切正常[prog] < [filename] [filename]
它会打开第二个文件名。
如何防止此情况发生。谢谢你的考虑。
答案 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