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



假设我们有一个像这样的简单程序:

int fd;
kq = kqueue();
EV_SET(&kev, fd, EVFILT_VNODE, EV_ADD, 0, 0, NULL);
kevent(kq, &kev, 1, &ke, 1, &timeout)

kevent在哪里检查fd是否是有效的文件描述符?它可能发现由fd表示的文件描述符是封闭的。

我不打算讨论系统调用是如何在freebsd中发生的(你可能还欠oracle另一个问题),但是,调用了sys_kevent()(/usr/src/sys/kerne/kernevent.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纳粹的?叹气

相关内容

  • 没有找到相关文章

最新更新