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

时间:2016-07-22 22:21:45

标签: c linux epoll manpage

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,而且我没有看到很多证据表明该程序甚至打算修改结构,所以就在那里。

1 个答案:

答案 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信息道歉。留下问题和这个答案给后人。