使用重定向运算符后检索stdin <
对于编程任务,我们有以下要求:
- 它需要是一个用C编写的命令行程序。
- 它需要从文本文档中读取文本。 但是,我们要在运行程序时使用Unix重定向运算符<而不是让程序加载文件本身。 (因此程序通过假装从stdin读取来读取文本。)
- 在从文件中读取数据之后,程序将在完成其工作之前向用户轮询一些额外信息。
经过大量的研究,我无法找到一种方法来检索“旧的”stdin以完成第(3)部分。 有人知道这是甚至可能吗?
技术上,第(3)部分是奖励部分的一部分,教师可能没有实现自己(这是非常冗长的),所以这可能是不可能的,这是他的疏忽。 但是,我当然不想跳到这个结论。
在linux上,我会打开控制终端/ dev / tty。
哪个OS? 在Linux上,实现此目的的通常技巧是检查stderr是否仍然连接到tty:
if (isatty(2))
如果是这样,打开一个新的读取文件描述符到该终端:
new_stdin = open("/proc/self/fd/2", O_RDONLY);
然后将新文件描述符复制到stdin(关闭旧的stdin):
dup2(new_stdin, 0);
(如果stderr也被重定向,那么isatty(2)
将返回false,你将不得不放弃。)
如果您运行这样的程序:
myprog 3<&0 < filename
然后你得到文件描述符3 作为stdin
的副本设置 。 我不知道这是否符合您的任务要求,但可能值得进行实验。