Linux:在不执行read()/write()操作的情况下检查套接字/管道是否损坏



我有一段简单的代码,可以定期将数据写入传递给它的fd。fd很可能是管道或套接字,但也可能是任何东西。每当我向套接字/管道写入()时,我都可以检测到它何时关闭/断开,因为我得到了一个EPIPE错误(我忽略了SIGPIPE)。但我并不是一直给它写信,所以可能很长一段时间都检测不到关闭的套接字。我需要尽快对关闭做出反应。有没有一种方法可以在不执行write()的情况下检查fd?如果我不写任何东西,我可以定期这样做。

struct pollfd pfd = {.fd = yourfd, .events = POLLERR};
if (poll(&pfd, 1, whatever) < 0) abort();
if (pfd.revents & POLLERR) printf("pipe is brokenn");

这对我来说确实有效。请注意,套接字并不完全是管道,因此会显示不同的行为(->使用POLLRDHUP)。

答案不错,我喜欢。。。我还需要退出选择习惯,进入(e)投票。

如果你需要的话,这里有一些更传统的方法:

/* check whether a file-descriptor is valid */
int fd_valid(int fd)
{   
    if (fcntl(fd, F_GETFL) == -1 && errno == EBADF) return FALSE;
    return TRUE;
}       

这个尝试复制socket/fd。它比外观简单得多,我在中留下了很多调试

/* check a file descriptor */
int fd_check(int i) {
    int fd_dup = dup(i);
    if (fd_dup == -1) {
        strcpy(errst, strerror(errno));
        // EBADF  oldfd isn’t an open file descriptor, or newfd is out of the allowed range for file descriptors.
        // EBUSY  (Linux only) This may be returned by dup2() during a race condition with open(2) and dup().
        // EINTR  The dup2() call was interrupted by a signal; see signal(7).
        // EMFILE The process already has the maximum number of file descriptors open and tried to open a new one.
        if (errno == EBADF) {
            return FALSE;
        }   
        return TRUE;
    }   
    close(fd_dup);
    return TRUE;
}   

尝试select及其errorfds参数:

int **select**(int nfds, fd_set *restrict readfds,
      fd_set *restrict writefds, **fd_set *restrict errorfds**,
      struct timeval *restrict timeout);

相关内容

最新更新