函数内局部struct kevent传入kevent后销毁是否会引发问题?
关于kevent调用中changelist结构体生命周期的问题
kevent系统调用签名(OSX/BSD)
int kevent(int kq, const struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout);
调用示例
struct kevent kqueue_event; EV_SET(&kqueue_event, fd_to_add, EVFILT_READ, EV_ADD, 0, /*data=*/0, NULL); kevent(watcher_fd, &kqueue_event, 1, NULL, 0, NULL);
问题
上述调用位于某函数内部,函数返回后kqueue_event结构体将立即超出作用域。已经将该结构体的指针传入kevent函数,这种情况后续是否会引发问题?还是kevent返回后该结构体就不再被需要?相关手册页中并未提及该结构体数组需要保留多久。
解答
这种情况不会引发任何问题。当你通过kevent传入changelist(比如这里的kqueue_event)执行EV_ADD这类操作时,内核只会在系统调用执行期间读取该结构体的内容,用来创建或更新对应的事件监听条目。一旦kevent调用返回,内核就完全不再依赖用户空间的这个结构体了——它已经把需要的所有信息(文件描述符、过滤类型、操作标志等)复制到了自己的内部存储结构中。
所以即便kqueue_event在函数返回后被销毁,也不会影响后续kqueue的正常工作,内核已经持有了维持事件监听所需的全部状态。
内容的提问来源于stack exchange,提问作者merlin2011
相关产品推荐
相关产品推荐

