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

时间:2015-10-28 05:29:21

标签: system-calls freebsd file-descriptor

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

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表示的文件描述符已关闭。

1 个答案:

答案 0 :(得分:0)

我不打算介绍如何在freebsd中发生系统调用(你可能欠oracle的另一个问题),但是调用了sys_kevent()(/ usr / src / sys / kern / kernel_event.c)并调用了它kern_kevent()(同一文件)。在下面的代码中,fget(fd)在处理文件指针之前检查你的文件描述符(对于exsiting,权限等,也可能会锁定它)。

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纳粹分子?叹息。