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

时间:2013-11-28 06:50:17

标签: c input stream stdin

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

2 个答案:

答案 0 :(得分:1)

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

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

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

scanf(...);

或者我误读了你,因为你想从用户那里读取两个来自管道?然后你可能需要打开与终端的直接连接。

为此,您可以使用ttyname获取stdout的TTY设备的名称,并打开该设备以输入以读取用户输入。如果stdout导致管道(或被重定向),那将无法工作。

答案 1 :(得分:1)

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

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

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

Threre不保证程序附加到任何交互设备,因此准备失败。

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