212.
213. /* 对于epoll来讲, 目前唯一有效的FLAG就是CLOEXEC */
214. if (flags & ~EPOLL_CLOEXEC)
215. return -EINVAL;
216. /*
217. * Create the internal data structure ("struct eventpoll").
218. */
219. /* 分配一个struct eventpoll, 分配和初始化细节我们随后深聊~ */
220. error = ep_alloc(&ep);
221. if (error < 0)
222. return error;
223. /*
224. * Creates all the items needed to setup an eventpoll file. That is,
225. * a file structure and a free file descriptor.
226. */
227. /* 这里是创建一个匿名fd, 说起来就话长了...长话短说:
228. * epollfd本身并不存在一个真正的文件与之对应, 所以内核需要创建一个
229. * "虚拟"的文件, 并为之分配真正的struct file结构, 而且有真正的fd.
230. * 这里2个参数比较关键:
231. * eventpoll_fops, fops就是file operations, 就是当你对这个文件(这里是虚拟的)进
行操作(比如读)时,
232. * fops里面的函数指针指向真正的操作实现, 类似C++里面虚函数和子类的概念.
233. * epoll只实现了poll和release(就是close)操作, 其它文件系统操作都有VFS全权处理
了.
234. * ep, ep就是struct epollevent, 它会作为一个私有数据保存在struct file的private
指针里面.
235. * 其实说白了, 就是为了能通过fd找到struct file, 通过struct file能找到eventpoll
结构.
236. * 如果懂一点Linux下字符设备驱动开发, 这里应该是很好理解的,
237. * 推荐阅读 <Linux device driver 3rd>
238. */
239. error = anon_inode_getfd("[eventpoll]", &eventpoll_fops, ep,
240. O_RDWR | (flags & O_CLOEXEC));
241. if (error < 0)
242. ep_free(ep);
243.
244. return error;
245. }
246.
247. /*
248. * 创建好epollfd后, 接下来我们要往里面添加fd咯
249. * 来看epoll_ctl
250. * epfd 就是epollfd
251. * op ADD,MOD,DEL
252. * fd 需要监听的描述符
253. * event 我们关心的events
254. */
255. SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd,
256. struct epoll_event __user *, event)
257. {
258. int error;
259. struct file *file, *tfile;
260. struct eventpoll *ep;
261. struct epitem *epi;