c - 对 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
谢谢你。
解决方案
- 在数组边界之外写入的行为是未定义的。此外,最多
read
读取给定的字节数。 - ???
推荐阅读
- python - 获取 JSON Python 第二个 List 的数据
- go - 如何使用 GORM 查询表中的所有行?
- react-native - 我电脑中的Expo App版本和SDK不匹配
- kotlin - 在 Kotlin/Ktor 中可序列化的自定义多部分表单数据
- react-native - react-native-reanimated & react-navigation/drawer 依赖错误
- sql - 如何更新 Presto 中的值
- dask - Dask - 自定义聚合
- laravel - 在 Valet 设置上使用 NuxtJS ant Sanctum 进行身份验证
- c++ - 连续读取后重置 ADC 控制标志 (ATMega2560)/Arduino
- java - 确认购买返回开发者错误“5”android studio