Linux:检查一个套接字/pipe道是否被破坏而不进行读取()/ write()

我有一段简单的代码将数据定期写入传递给它的fd。 FD最有可能是一个pipe道或套接字,但可能是任何东西。 由于我得到一个EPIPE错误(我忽略了SIGPIPE),所以当我写入()时,我可以检测到socket / pipe何时closures/中断。 但是我不会一直写信,所以很长一段时间可能无法检测到一个封闭的套接字。 我需要尽快对封闭做出反应。 有没有办法检查FD而不必做一个写()? 如果我没有写任何东西,我可以定期做这个。

Solutions Collecting From Web of "Linux:检查一个套接字/pipe道是否被破坏而不进行读取()/ write()"

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

这对我有用。 请注意,套接字不完全是管道,因此显示不同的行为( – >使用POLLRDHUP)。

尝试使用select和它的errorfds参数:

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

很好的答案,我喜欢他们…我也需要摆脱选择习惯,进入(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; }