我尝试使用inotify进行一些工作,并且更好地理解C语言。我非常新手。我正在查看inotify手册页,我看到了使用inotify的一个例子。我对他们如何使用缓冲区有一些疑问。代码在这里:
http://man7.org/linux/man-pages/man7/inotify.7.html
我最感兴趣的是:
char buf[4096]
__attribute__ ((aligned(__alignof__(struct inotify_event))));
const struct inotify_event *event;
int i;
ssize_t len;
char *ptr;
/* Loop while events can be read from inotify file descriptor. */
for (;;) {
/* Read some events. */
len = read(fd, buf, sizeof buf);
if (len == -1 && errno != EAGAIN) {
perror("read");
exit(EXIT_FAILURE);
}
/* If the nonblocking read() found no events to read, then
it returns -1 with errno set to EAGAIN. In that case,
we exit the loop. */
if (len <= 0)
break;
/* Loop over all events in the buffer */
for (ptr = buf; ptr < buf + len;
ptr += sizeof(struct inotify_event) + event->len) {
event = (const struct inotify_event *) ptr;
我想要了解的是处理这个缓冲区中的位的确切程度。这就是我所知道的:
我们定义了一个4096的char buf
,这意味着我们有一个大约4kbs的缓冲区。当呼叫read(fd, buf, sizeof buf)
和len
将在0到4096之间时(可以发生部分读取)。
我们做了一些异步检查,这很明显。
现在我们进入for循环,这里是我有点困惑的地方。我们将ptr
设置为buf
,然后将ptr
的尺寸与buff + len
进行比较。
此时ptr
等于&#39; 4096&#39; ?如果是这样我们就说;是ptr:4096&lt; buf:4096 + len:[0-4096]。我在这里使用冒号表示我认为变量的值是什么,[]表示范围。
然后我们作为迭代器表达式,增加ptr+=
inotify事件的大小。
我习惯使用更高级别的OOP语言,其中我声明了一个&#39; inotify_event&#39;的缓冲区。对象。但是我假设是因为我们刚从“读取”中读回一个字节数组。我们需要在&#39; inotify_event&#39;边界和类型将这些位转换为事件对象。这听起来不错吗?
此外,我还不确定比较如何与buf[4096]
值一起使用。我们没有检查数组当前大小(已分配索引)的概念,所以我假设在比较中使用时,我们正在比较它的分配内存空间的大小&# 39; 4096&#39;在这种情况下?
感谢您的帮助,这是我第一次真正处理缓冲区中的位。试图绕过这一切。任何进一步阅读都会有所帮助!我已经找到了很多关于C作为语言的阅读,对linux系统编程有很多阅读,但我似乎无法找到诸如“使用缓冲区”这样的主题&#39 ;或两者之间的灰色区域。
答案 0 :(得分:0)
在C中执行作业ptr = buf
时,您要将buf
的第一个元素的地址指定给ptr
。因此,比较是检查ptr是否超出了缓冲区的末尾。
循环跳过跳过一个struct inotify_event
所需的字节数,该.get_queryset()
定义为here,以及事件名称的长度。
答案 1 :(得分:0)
ptr = buf
您正在将buf
的第一个元素(即&buf[0]
)的地址指定给指针ptr
。所以你开始使用从第一个元素开始的指针循环遍历buf。
ptr < buf + len;
这是检查你的ptr
指针是&#34;移动&#34;通过数组直到buf
结束。它是使用指针算法制作的。因此,循环比较ptr
指向地址的地址与buf
的地址+ len
函数返回的缓冲区的read
。
ptr += sizeof(struct inotify_event) + event->len
最后,指针向前移动事件struct struct inotify_event
的大小加上事件len,我猜这是基于事件类型的变量。