c-如何中断另一个标准输入流



这个问题可能有点难以说明。例如,一个程序从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的输入流?

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

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

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

我们不能保证程序连接到任何交互式设备上,所以要做好失败的准备。

请注意,以这种方式编写程序被认为是不好的风格。如果需要任何用户输入,那么一个聪明的程序应该只使用stdin。然后,所有其他输入流都应该通过命令行参数作为文件名传递。

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

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

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

还是我误读了你,因为你想从用户那里读,从管道里读?然后,您可能需要打开与终端的直接连接。

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

最新更新