【发布时间】:2010-11-15 12:22:06
【问题描述】:
fgetc() 和其他输入函数可以在文件描述符上没有数据时返回。这可以为从标准输入读取的控制台应用程序模拟,在键盘上键入 Ctrl-D(至少在 unix 上)。但是如何以编程方式进行呢?比如下面代码中如何从reader线程中的fgetc()返回(注意:忽略可能的竞态条件)?
#include <pthread.h>
#include <stdio.h>
void* reader()
{
char read_char;
while((read_char = fgetc(stdin)) != EOF) {
;
}
pthread_exit(NULL);
}
int main(void)
{
pthread_t thread;
pthread_create(&thread, NULL, reader, NULL);
// Do something so the fgetc in the reader thread will return
pthread_exit(NULL);
}
谢谢!
【问题讨论】:
-
我认为您只是想
close()管道的另一端,但您的示例并没有真正意义,因为主线程不控制标准输入的另一端。 -
我在这几周前尝试过,但我没有找到任何了解标准输入另一端的方法。还有其他方法可以实现相同的目标吗?也许我遗漏了一些东西:我只需要一种不阻塞控制台输入线程的方法。
-
标准输入的另一端通常是终端的键盘。也许您需要的是非阻塞 I/O?从你的问题很难判断。你应该更详细地解释你想要做什么。
-
不,我不需要非阻塞 I/O。从某种意义上说,我至少应该使用 select() 或 poll() 轮询输入超时:这比尝试关闭终端键盘设备更错误。在我看来,我试图从不同的线程访问标准输入是错误的。这可能是错误的,我应该通过将应用程序的状态保持在输入“阅读器”的范围内来避免这种情况,这样我就可以轻松跟踪何时应该处理输入。
-
顺便说一下,相当于 UNIX 的 control-D 的 Windows 是 control-Z。