目前我有一个问题,当调用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
不会阻塞。 如果要设置超时,请使用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
)留给你。
用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); }