我在调用read()时遇到问题:
unsigned char byData[1024] = {0};
ssize_t len = read(fd, byData, sizeof(byData));
其中fd是文件描述符。
read()是阻塞,这不是我想要的。 有没有一种简单的方法可以将读取设置为非阻塞或超时? 该代码与inotify一起使用。
感谢您的帮助。
答案 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
不会阻止。如果您要设置超时,请使用select
或poll
fd_set fds;
FD_ZERO(&fds);
FD_SET(fd, &fds);
struct timeval t = {/*seconds*/, /*microseconds*/};
select(fd + 1, &fds, NULL, NULL, &t);
错误处理和后续工作(select
将覆盖fds
和t
)留给您。
答案 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)