【问题标题】:May `epoll_ctl` modify the `epoll_event` structure passed to it?`epoll_ctl`可以修改传递给它的`epoll_event`结构吗?
【发布时间】:2016-07-22 22:21:44
【问题描述】:

Linux kernel manpages 声明epoll_ctl 过程如下:

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

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

在这个问题的上下文中,this 的意义在于在指针类型声明之前没有const,因此,似乎允许该过程修改传递的结构的内容。

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

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

我也看过relevant source code in kernel 4.6 tree,我没有看到太多证据表明该程序甚至打算修改结构,所以在那里。

【问题讨论】:

    标签: c linux epoll manpage


    【解决方案1】:

    找到一个相当conclusive answer on the Linux mailing list。在此引用 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 sitbon 写道:

    目前epoll_ctl的原型是:

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

    我在epoll_ctl和google的man里搜了一下,好像 事件指向的结构没有被修改,valgrind 证实了这一点 行为,我错了吗?或者好的原型是

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

    根据目前的ctl操作,是的。但这样做会阻止 其他非常量操作稍后添加。

    • 大卫

    要点是,即使事实上的行为不是修改结构,接口也省略了const 修饰符,因为将来可能会通过相同的系统调用添加其他控制操作,这需要一个潜在的可修改结构指向event 参数。

    我应该首先点击内核邮件列表,为关于 SO 的另一个可能冗余信息道歉。将问题和答案留给后代。

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 1970-01-01
      • 2012-03-28
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 2010-12-21
      相关资源
      最近更新 更多