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

时间:2014-07-23 14:37:52

标签: linux file-io

我在调用read()时遇到问题:

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

其中fd是文件描述符。

read()是阻塞,这不是我想要的。 有没有一种简单的方法可以将读取设置为非阻塞或超时? 该代码与inotify一起使用。

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

你无法使这种系统调用无阻塞;相反,你可以使文件描述符在非阻塞上工作

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)留给您。

答案 1 :(得分:2)

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

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

如您所见,您可以设置超时。这对于无法使用O_NONBLOCK标志打开文件,或者根本不调用open()的情况非常有用。

答案 2 :(得分:1)

使用open(fd, ...)标记呼叫O_NONBLOCK

来自open()手册页:

  

O_NONBLOCK或O_NDELAY:如果可能,将打开文件   非阻塞模式。 open()和后续操作都没有   返回的文件描述符将导致调用   等待的过程。有关处理FIFO(命名管道)的信息,另请参阅   FIFO(7)。有关O_NONBLOCK结合的影响的讨论   有强制文件锁和文件租约,请参阅fcntl(2)。

答案 3 :(得分:0)

此主题已被描述为here

您也可以尝试timer或线程。 这是线程的例子

#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);
}