Linux kernel manpages声明epoll_ctl
程序如下:
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
很明显,event
参数被声明为指向epoll_event
struct
的指针。
在这个问题的上下文中,这一点的重要性在于指针类型声明之前没有const
,因此,过程似乎被允许修改传递结构的内容。
这是一种遗漏,还是因为程序是按照设计进行的,我们必须假设传递的结构确实可以在程序中修改?
我理解这里的声明是明确的,但有没有人认为这是一个遗漏?
我还看了一下relevant source code in kernel 4.6 tree,而且我没有看到很多证据表明该程序甚至打算修改结构,所以就在那里。
答案 0 :(得分:3)
找到一个相当conclusive answer on the linux kernel mailing list。引用Davide Libenzi,epoll
的主要作者或唯一作者:
From: Davide Libenzi <davidel <at> xmailserver.org> Subject: Re: epoll_ctl and const correctness Newsgroups: gmane.linux.kernel Date: 2009-03-25 16:23:21 GMT (7 years, 17 weeks, 1 day, 9 hours and 4 minutes ago) On Wed, 25 Mar 2009, nicolas sitbon wrote: > Currently, the prototype of epoll_ctl is : > > int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); > > I searched in the man of epoll_ctl and google, and it seems that the > structure pointed to by event isn't modify, valgrind confirms this > behaviour, so am I wrong? or the good prototype is > > int epoll_ctl(int epfd, int op, int fd, struct epoll_event const *event); According to the current ctl operations, yes. But doing that would prevent other non-const operations to be added later on. - Davide
需要注意的是,即使事实上的行为不是要修改结构,接口也会省略const
修饰符,因为将来可能会通过相同的系统调用添加其他控制操作,这需要潜在的可修改结构正如event
论证所指出的那样。
我应该首先访问linux内核邮件列表,为另一个可能冗余的SO信息道歉。留下问题和这个答案给后人。