目前我在调用read()时遇到了一个问题:
unsigned char byData[1024] = {0};
ssize_t len = read(fd, byData, sizeof(byData));
其中fd是文件描述符。
read()是阻塞的,这不是我想要的。有没有简单的方法将read设置为非阻塞或超时?该代码与inotify一起使用。
感谢任何帮助。
目前我在调用read()时遇到了一个问题:
unsigned char byData[1024] = {0};
ssize_t len = read(fd, byData, sizeof(byData));
其中fd是文件描述符。
read()是阻塞的,这不是我想要的。有没有简单的方法将read设置为非阻塞或超时?该代码与inotify一起使用。
感谢任何帮助。
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
)由您负责。您可以使用 poll 函数来监控文件描述符,以便知道何时有数据可供读取。然后再调用 read()
函数。
# Poll definition
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
正如您所看到的,您可以设置超时时间。这在文件无法使用O_NONBLOCK
标志打开或根本没有调用open()
的情况下非常有用。
使用带有O_NONBLOCK
标志的open(fd, ...)
进行调用。
来自open()
手册页:
O_NONBLOCK或O_NDELAY:在可能的情况下,以非阻塞方式打开文件。返回的文件描述符上的任何后续操作都不会导致调用进程等待。关于FIFO(命名管道)的处理,请参见fifo(7)。有关O_NONBLOCK与强制文件锁和文件租约结合使用时的影响的讨论,请参见fcntl(2)。