kevent()在哪里验证其文件描述符?

3
假设我们有一个像这样简单的程序:
int fd;
kq = kqueue();
EV_SET(&kev, fd, EVFILT_VNODE, EV_ADD, 0, 0, NULL);
kevent(kq, &kev, 1, &ke, 1, &timeout)
< p > kevent 在哪里检查 fd 是否为有效文件描述符?它可能会发现由 fd 表示的文件描述符已关闭。

我不太清楚你在问什么。如果你传递一个已关闭的文件描述符给kevent,会发生什么? - arrowd
@arrowd 感谢您的回复。是的,如果我传递给 kevent 一个已经关闭的 fd 会发生什么?我认为在 kevent 中应该有这样的检查,但我没有找到它... - HuangJie
好的,你可以编译你的代码并尝试。我猜,kevent不会返回-1来表示错误,而是会简单地删除这个过滤器,因为当被监视的fd关闭时,它就是这样做的。 - arrowd
1个回答

0
我不打算覆盖FreeBSD中系统调用的发生方式(您可能需要另一个问题向Oracle请教),但是会调用sys_kevent() (/usr/src/sys/kern/kern_event.c),并且它会调用kern_kevent()(同一文件)。在下面的代码中,fget(fd)在返回文件指针之前检查您的文件描述符(是否存在,权限等)。可能还会锁定它。
int
kern_kevent(struct thread *td, int fd, int nchanges, int nevents,
    struct kevent_copyops *k_ops, const struct timespec *timeout)
{
    cap_rights_t rights;
    struct file *fp;
    int error;

    cap_rights_init(&rights);
    if (nchanges > 0)
        cap_rights_set(&rights, CAP_KQUEUE_CHANGE);
    if (nevents > 0)
        cap_rights_set(&rights, CAP_KQUEUE_EVENT);
    error = fget(td, fd, &rights, &fp);
    if (error != 0)
        return (error);

    error = kern_kevent_fp(td, fp, nchanges, nevents, k_ops, timeout);
    fdrop(fp, td);

    return (error);
}

嘿...我什么时候成为了UTSL纳粹?唉。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接