gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:45:33 27 4
gpt4 key购买 nike

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

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

关于system-calls - kevent() 在哪里验证其文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33383545/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com