使用重定向运算符后检索stdin <

对于编程任务,我们有以下要求:

  1. 它需要是一个用C编写的命令行程序。
  2. 它需要从文本文档中读取文本。 但是,我们要在运行程序时使用Unix重定向运算符<而不是让程序加载文件本身。 (因此程序通过假装从stdin读取来读取文本。)
  3. 在从文件中读取数据之后,程序将在完成其工作之前向用户轮询一些额外信息。

经过大量的研究,我无法找到一种方法来检索“旧的”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的副本设置 。 我不知道这是否符合您的任务要求,但可能值得进行实验。