Linux 内核手册页 声明
epoll_ctl
过程如下:
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
显然,
event
参数被声明为指向epoll_event
struct
的指针。
在这个问题的上下文中,上述观察的重要性在于,指针类型声明之前没有
const
,因此,该过程似乎被允许修改传递的结构的内容。
这是某种遗漏,还是程序是故意设计成这样的,我们必须假设传递的结构确实可以在程序内部进行修改?
我知道这里的声明是明确的,但是有理由相信这是一个遗漏吗?
我还查看了内核4.6树中的相关源代码,我没有看到太多证据表明该程序甚至打算修改结构,所以就这样了。
在 Linux 邮件列表上找到了一个相当结论性的答案。在这里引用
epoll
的主要或唯一作者 Davide Libenzi:
来自:Davide Libenzixmailserver.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
论证。我应该首先访问内核邮件列表,对另一个可能是冗余的信息表示歉意。将问题和答案留给后代。