【问题标题】:How to interrupt standard input stream for another如何中断另一个标准输入流
【发布时间】:2013-12-14 02:23:42
【问题描述】:

这个问题可能有点难以说明。例如,一个程序接收来自stdin 的字符串,但它需要来自用户的交互式输入,如下所示:

echo "Some text to handle later after command is specified" | a.out 

在程序的开头:

printf("Please input command first");
scanf("%s", &cmd);
/* Some Code Here */
/* process "Some text to handle later after command is specified" */

有没有办法“暂停”先前的输入流并等待scanf 的输入流?

【问题讨论】:

    标签: c input stream stdin


    【解决方案1】:

    除了从标准输入读取之外,该标准没有指定任何获取交互式用户输入的方法。由于您的标准输入被管道占用,因此您需要执行特定于实现的路径。

    对于类 Unix 系统,这将是一个名为 /dev/tty 的特殊文件。 fopen 它并使用普通的 stdio 函数。

    在 Windows 上,您可能需要调用 Console API。

    无法保证程序会连接到任何交互式设备,所以要做好失败的准备。

    请注意,以这种方式编写程序被认为是不好的风格。如果有任何预期的用户输入,一个机智的程序应该只使用标准输入。然后应通过命令行参数将所有其他输入流作为文件名传递。

    【讨论】:

      【解决方案2】:

      当使用管道时,shell 将程序 stdin 设置为来自上一个命令的输出。所以阅读应该不是问题。

      这里的问题是,如果输入来自管道(或重定向),则不应打印任何输出。这可以通过检查isatty 函数的结果来完成:

      if (isatty(fileno(stdin)))
      {
          /* Only print prompt if input is an interactive terminal */
          printf(...);
      }
      
      scanf(...);
      

      或者我误读了你,因为你想从用户那里读取 both,从管道中读取 ?然后你可能必须打开到终端的直接连接。

      为此,您可以使用ttyname 获取stdout 的TTY 设备的名称,然后打开该设备进行输入以读取用户输入。如果stdout 也通向管道(或正在被重定向),这将不起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-03
        • 2015-06-01
        • 2011-01-06
        • 2018-12-13
        • 1970-01-01
        相关资源
        最近更新 更多