首页 > 解决方案 > 对 read() 系统调用感到困惑

问题描述

read()对获取 inotify 事件的调用感到非常困惑。

这是代码:

#define EVENT_SIZE sizeof(inotify_event)
int fd = inotify_init();
int wd = inotify_add_watch(fd, dir, IN_MODIFY);
void* p = malloc(sizeof(EVENT_SIZE));
read(wd, p, (EVENT_SIZE + 10));

我的测试文件是a.txt. 在 gdb 中调试后的输出为:

{wd = 0, mask = 0, cookie = 0, len = 0, name = 0x558f05d002d0 ""}

现在,当我将最后一行更改为 时read(fd, p, (EVENT_SIZE + 16));,我在 gdb 中得到的输出是:

{wd = 1, mask = 2, cookie = 0, len = 16, name = 0x5625cdd422d0 ".a.txt.swp"}

Q1。为什么我没有收到溢出错误,因为在这两种情况下,我写的都超过了分配的缓冲区p

Q2。如果没有错误,那么我的第一个程序也应该可以工作,因为我的文件名小于 10,但它不起作用,它只适用于 16。我在这里缺少什么?

编译器 -g++ 9.3.0

操作系统 -ubuntu 20.04

谢谢你。

标签: csysteminotify

解决方案


  1. 在数组边界之外写入的行为是未定义的。此外,最多read读取给定的字节数。
  2. ???

推荐阅读