gpt4 book ai didi

linux-kernel - MINIX:通过文件名检索文件的 inode

转载 作者:行者123 更新时间:2023-12-02 18:06:03 28 4
gpt4 key购买 nike

MINIX 3.2.1中,我想创建一个新的系统调用,它将提供一个文件名作为参数,并打印特定文件的 inode 号。

我已经创建并修改了执行此操作所需的所有文件。

因此,为了按文件名检索文件的 inode,我想使用默认系统调用:

int stat(char *name, struct stat *buffer)

http://minix1.woodhull.com/manpages/man2/stat.2.html

在我的新系统调用处理程序的主体中

int mycall_1(void); 位于 /usr/src/servers/vfs/misc.c

但是当我编译并尝试测试新的系统调用时,在应该调用 stat 系统调用的地方,它实际上不会调用,而是打印消息:

sys_call:ipc 掩码从 1 到 1 拒绝 SENDREC

那么,在我的新系统调用中是否禁止使用 stat ?如果是这样,还有其他方法可以通过文件名检索文件的 inode 吗?

提前致谢。

最佳答案

stat是一个包含许多核心函数的系统调用。您不能在系统函数中使用系统调用,因为 Minix 的结构需要在客户端和服务器进程之间交换消息,以便实现系统调用本身。

对应的系统函数为do_stat并且也不能用于您的目的。

最终,虚拟文件​​服务器中所需的所有文件处理功能都可以追溯到查找高级

我们可以检查一下path.c吗?文件位于 VFS 目录中,我们最终发现 lookup_initeat_path 是最合适的函数。在下面的示例中,第一个将节点详细信息初始化/准备到 lookup 结构,而后者依赖于 advance 并解析给定的节点路径。

int do_printinode() {
struct lookup resolve;
struct vnode *vp;
struct vmnt *vmp;
lookup_init(&resolve, m_in.m3_ca1, PATH_NOFLAGS, &vmp,
&vp);
resolve.l_vmnt_lock = VMNT_READ;
resolve.l_vnode_lock = VNODE_READ;
vp = eat_path(&resolve, fp);
if(*vp!=NULL) printf(“inode: %d\n”, vp->v_inode_nr);
else printf(“inode: -\n”);
return 0;
}

当然,还必须创建或修改其他文件才能实现正确的系统调用。

关于linux-kernel - MINIX:通过文件名检索文件的 inode ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37353209/

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