我们假设我们有一个简单的程序:
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
表示的文件描述符已关闭。
答案 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纳粹分子?叹息。