在 NetBSD 系统文件 usr/src/sys/sys/vnode.h 中定义了一个 vnode 的结构。但是,我看到有时在执行操作(比如说 ufs_getattr)时,vnode* 会作为 void* 传递给被调用的操作。
每个这样的操作都有其参数结构。例如,ufs_getattr() 的结构如下:
struct vop_getattr_args /* {
struct vnode *a_vp;
struct vattr *a_vap;
kauth_cred_t a_cred;
};
通常,这些操作的第一行执行将实际上是 void* 的 vnode 指针分配到此参数类型指针的指针中。例如,我们执行以下操作:
int
ufs_getattr(void *v)
{
struct vop_getattr_args /* {
struct vnode *a_vp;
struct vattr *a_vap;
kauth_cred_t a_cred;
} */ *ap = v; //why this is okay to do ?
struct vnode *vp;
struct inode *ip;
struct vattr *vap;
vp = ap->a_vp; //wont this break ?
从 usr/src/sys/ufs/ufs/ufs_vnops.c 中提取
由于 C 编程知识很少,我无法证明这种不匹配的分配是正确的,因为类型并不真正匹配。