gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:36:03 27 4
gpt4 key购买 nike

我正在尝试使用 inotify 做一些工作,并更好地理解 C 语言。我很新手。我正在查看 inotify 手册页,看到了使用 inotify 的示例。我对他们到底如何使用缓冲区有一些疑问。代码在这里:

http://man7.org/linux/man-pages/man7/inotify.7.html

我最感兴趣的 block 是:

       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;

我想要了解的是如何准确地处理该缓冲区中的位。这是我所知道的:

我们将 char buf 定义为 4096,这意味着我们的缓冲区大小约为 4kbs。当调用 read(fd, buf, sizeof buf) 时,len 将为 0 - 4096 之间的任意值(可能会发生部分读取)。

我们做了一些异步检查,这是显而易见的。

现在我们进入 for 循环,这是我有点困惑的地方。我们将 ptr 设置为等于 buf,然后将 ptr 的大小与 buff + len 进行比较。

此时,ptr 等于值“4096”吗?如果是这样,我们会说;是 ptr:4096 < buf:4096 + len:[0-4096]。我在这里使用冒号来表示我认为变量的值,[] 表示范围。

然后,我们作为迭代器表达式,增加 inotify 事件的 ptr+= 大小。

我习惯了高级 OOP 语言,在其中我会声明“inotify_event”对象的缓冲区。但是我假设,由于我们只是从“读取”中返回一个字节数组,因此我们需要在“inotify_event”边界处进行咬合,并将这些位类型转换为事件对象。这听起来正确吗?

此外,我不太确定如何使用 buf[4096] 值进行比较。我们没有检查数组当前大小(分配的索引)的概念,所以我假设在比较中使用时,我们正在比较在这种情况下分配的内存空间“4096”的大小?

感谢您的帮助,这是我第一次真正处理缓冲区中的位。试图理解这一切。任何进一步的阅读都会有帮助!我已经找到了大量关于 C 作为一种语言的阅读 Material ,大量关于 Linux 系统编程的阅读 Material ,但我似乎找不到诸如“使用缓冲区”或两者之间的灰色区域之类的主题。

最佳答案

当您在 C 中执行赋值 ptr = buf 时,您是将 buf 第一个元素的地址赋给 ptr。因此,比较是检查 ptr 是否超出缓冲区末尾。

循环按照跳过一个 struct inotify_event 所需的字节数进行跳转,该结构定义为 here ,以及事件名称的长度。

关于你能帮忙解释一下这个缓冲区逻辑是如何工作的吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41821630/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com