我需要用纯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/

10-09 18:08
查看更多