amn*_*amn 4 c linux epoll manpage
Linux内核手册页声明该epoll_ctl过程如下:
Run Code Online (Sandbox Code Playgroud)int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
显然,该event参数被声明为指向epoll_event struct.
在这个问题的上下文中,所述观察的重要性在于,指针类型声明之前没有const,因此,该过程似乎被允许修改传递的结构的内容。
这是某种遗漏,还是程序是故意设计的,我们必须假设传递的结构确实可以在程序内修改?
我知道这里的声明是明确的,但是有理由相信这是一个遗漏吗?
我还查看了内核4.6树中的相关源代码,并且我没有看到太多证据表明该程序甚至打算修改结构,所以就在那里。
在 Linux 邮件列表上找到了相当确定的答案。此处引用 Davide Libenzi,其主要或唯一作者epoll:
来自:Davide Libenzi <davidel <at> xmailserver.org> 主题:回复:epoll_ctl 和 const 正确性 新闻组:gmane.linux.kernel 日期:2009-03-25 16:23:21 GMT(7年17周1天9小时4分钟前)2009 年 3 月 25 日星期三,nicolas satbon 写道:
目前,epoll_ctl的原型是:
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
我在epoll_ctl的man和google里搜了一下,好像是 事件指向的结构未修改,valgrind 确认了这一点 行为,所以我错了吗?或者好的原型是
int epoll_ctl(int epfd, int op, int fd, struct epoll_event const *event);
根据目前的ctl操作,是的。但这样做会阻止 稍后将添加其他非常量操作。
- 达维德
结论是,即使事实上的行为不是修改结构,接口也会故意const省略修饰符,因为将来可能通过同一系统调用添加其他控制操作,从而需要参数指向的潜在可修改结构。event
我应该先点击内核邮件列表,为另一个关于 SO 的可能多余的信息道歉。把问题和答案留给后人。