假设我们有一个像这样的简单程序:
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纳粹的?叹气