你能帮忙解释一下这个缓冲逻辑是如何工作的

时间:2017-01-24 06:42:49

标签: c buffer inotify

我尝试使用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 ;或两者之间的灰色区域。

2 个答案:

答案 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,我猜这是基于事件类型的变量。