我搜索但没有得到这个问题的相关答案,我正在使用linux机器,我想检查标准输入流是否包含任何字符,而不从流中删除字符。
答案 0 :(得分:6)
您可能想尝试select()函数,并等待将数据输入到输入流中。
说明强>
select()和pselect()允许程序监视多个文件 描述符,等待一个或多个文件描述符变为 “准备好”用于某类I / O操作(例如,输入可能)。一份文件 如果可以执行,则认为描述符已准备就绪 相应的I / O操作(例如,read(2))没有阻塞。
在您的情况下,文件描述符将为stdin
void yourFunction(){
fd_set fds;
struct timeval timeout;
int selectRetVal;
/* Set time limit you want to WAIT for the fdescriptor to have data,
or not( you can set it to ZERO if you want) */
timeout.tv_sec = 0;
timeout.tv_usec = 1;
/* Create a descriptor set containing our remote socket
(the one that connects with the remote troll at the client side). */
FD_ZERO(&fds);
FD_SET(stdin, &fds);
selectRetVal = select(sizeof(fds)*8, &fds, NULL, NULL, &timeout);
if (selectRetVal == -1) {
/* error occurred in select(), */
printf("select failed()\n");
} else if (selectRetVal == 0) {
printf("Timeout occurred!!! No data to fetch().\n");
//do some other stuff
} else {
/* The descriptor has data, fetch it. */
if (FD_ISSET(stdin, &fds)) {
//do whatever you want with the data
}
}
}
希望它有所帮助。
答案 1 :(得分:5)
cacho位于正确的路径上,但只有在处理多个文件描述符时才需要select
,并且stdin
不是POSIX文件描述符(int
) ;这是一个FILE *
。如果你走这条路,你会想要使用STDIN_FILENO
。
这也不是一条非常干净的路线。我更愿意使用poll
。通过将0指定为timeout
,poll将立即返回。
如果在任何选定文件上都没有发生任何定义的事件 描述符,poll()应至少等待超时毫秒 在任何选定的文件描述符上发生的事件。 如果值 超时为0,poll()应立即返回。如果值为 超时为-1,poll()将阻塞,直到发生请求的事件或 直到通话中断。
struct pollfd stdin_poll = { .fd = STDIN_FILENO
, .events = POLLIN | POLLRDBAND | POLLRDNORM | POLLPRI };
if (poll(&stdin_poll, 1, 0) == 1) {
/* Data waiting on stdin. Process it. */
}
/* Do other processing. */