我需要用纯C语言编写的程序在stdin关闭时停止执行。
在程序主循环中有不确定的工作要做,并且在那里我无法使用阻塞检查(如getc()
)(不应将任何数据到达stdin上-它只是在未知时间内保持打开状态)。
我打算使用描述的功能来实现inetd,xinetd或它们的类似物中托管的网络守护程序-当连接保持打开状态时,它应该在stdout上发出数据,并在关闭时正确地完成工作。现在我的程序被托管服务杀死了,因为它在连接终止后不会停止。
我想知道是否将应用于odt_code标志的fctntl()
应用于stdin描述符,是否允许我在非阻塞模式下使用O_NONBLOCK
函数?我应该以某种方式使用read()
吗?
P.S.不应假定该数据,但可能会到达stdin。一种无阻塞的读出方式应该是该问题的答案。
最佳答案
select()完全满足您的要求:信号不会对文件描述符(文件,套接字等)进行操作(在这种情况下为read)。
#include <stdio.h>
#include <sys/select.h>
int is_ready(int fd) {
fd_set fdset;
struct timeval timeout;
int ret;
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
timeout.tv_sec = 0;
timeout.tv_usec = 1;
//int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
struct timeval *timeout);
return select(fd+1, &fdset, NULL, NULL, &timeout) == 1 ? 1 : 0;
}
现在,您可以在使用之前检查文件描述符,例如为了清空文件描述符:
void empty_fd(int fd) {
char buffer[1024];
while (is_ready(fd)) {
read(fd, buffer, sizeof(buffer));
}
}
在您的情况下,请使用 fileno(stdin)获取stdin的文件描述符:
if (is_ready(fileno(stdin))) {
/* read stuff from stdin will not block */
}
关于c - 如何检查stdin是否仍然打开而没有阻塞?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1594251/