如何将read()设置为非阻塞模式

目前我有一个问题,当调用read()像这样:

unsigned char byData[1024] = {0}; ssize_t len = read(fd, byData, sizeof(byData)); 

其中fd是文件描述符。

read()阻塞哪个不是我想要的。 有一个简单的方法来设置读取非阻塞或超时? 代码与inotify一起使用。

谢谢你的帮助。

您可以在文件描述符上使用轮询来了解何时有数据要读取。 然后,调用read()

 # Poll definition int poll(struct pollfd *fds, nfds_t nfds, int timeout); 

正如你所看到的,你可以设置超时。 这对于无法用O_NONBLOCK标志打开文件或者根本不调用open()情况是有用的。

你不能使这样的系统调用非阻塞; 相反,您可以使文件描述符在非阻塞状态下工作

 fcntl(fd, F_SETFL, O_NONBLOCK) 

要么

 int flags = fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, flags | O_NONBLOCK); 

如果您需要添加O_NONBLOCK并保留之前设置的标志。

这样read不会阻塞。 如果要设置超时,请使用selectpoll

 fd_set fds; FD_ZERO(&fds); FD_SET(fd, &fds); struct timeval t = {/*seconds*/, /*microseconds*/}; select(fd + 1, &fds, NULL, NULL, &t); 

错误处理和下面的工作( select将覆盖fdst )留给你。

O_NONBLOCK标志调用open(fd, ...)

open()手册页:

O_NONBLOCK或O_NDELAY:如果可能,文件以非阻塞模式打开。 对于返回的文件描述符,open()或后续操作都不会导致调用进程等待。 有关FIFO(命名管道)的处理,另请参阅fifo(7)。 有关O_NONBLOCK与强制文件锁定以及文件租约相关的讨论,请参见fcntl(2)。

这个话题已经在这里描述了 。

你也可以尝试计时器或线程。 这是线程的例子

 #include <pthread.h> unsigned char byData[1024] = {0}; ssize_t len; void *thread(arguments) { while (1) { len = read(fd, byData, sizeof(byData)); } int main(){ pthread_t pth; pthread_create(&pth, NULL, thread, arguments); }