`epoll_ctl`可以修改传递给它的`epoll_event`结构吗?

问题描述 投票:0回答:1

Linux 内核手册页 声明

epoll_ctl
过程如下:

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

显然,

event
参数被声明为指向
epoll_event
struct
的指针。

在这个问题的上下文中,上述观察的重要性在于,指针类型声明之前没有

const
,因此,该过程似乎被允许修改传递的结构的内容。

这是某种遗漏,还是程序是故意设计成这样的,我们必须假设传递的结构确实可以在程序内部进行修改?

我知道这里的声明是明确的,但是有理由相信这是一个遗漏吗?

我还查看了内核4.6树中的相关源代码,我没有看到太多证据表明该程序甚至打算修改结构,所以就这样了。

c linux epoll manpage
1个回答
8
投票

在 Linux 邮件列表上找到了一个相当结论性的答案。在这里引用

epoll
的主要或唯一作者 Davide Libenzi:

来自:Davide Libenzi  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
 论证。

我应该首先访问内核邮件列表,对另一个可能是冗余的信息表示歉意。将问题和答案留给后代。

© www.soinside.com 2019 - 2024. All rights reserved.