Linux kernel MINIX:检索文件';按文件名设置索引节点

Linux kernel MINIX:检索文件';按文件名设置索引节点,linux-kernel,system-calls,stat,minix,Linux Kernel,System Calls,Stat,Minix,在MINIX 3.2.1中,我想创建一个新的系统调用,它将被指定一个文件名作为参数,并将打印特定文件的索引节点号 我已经创建并修改了所有需要的文件 因此,为了按文件名检索文件的inode,我想使用默认的系统调用: int stat(char *name, struct stat *buffer) 在我的新系统调用处理程序的主体中 int mycall_1(无效)内部/usr/src/servers/vfs/misc.c 但是当我编译并尝试测试新的系统调用时,在应该调用stat系统调用的地方,

MINIX 3.2.1中,我想创建一个新的系统调用,它将被指定一个文件名作为参数,并将打印特定文件的索引节点号

我已经创建并修改了所有需要的文件

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

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

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

int mycall_1(无效)内部
/usr/src/servers/vfs/misc.c

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

sys\u调用:ipc掩码拒绝从1发送到1

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

提前感谢。

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

相应的系统功能是,也不能用于您的目的

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

如果我们检查VFS目录中的文件,我们最终会发现lookup_init和eat_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;
}
当然,为了实现正确的系统调用,还必须创建或修改其他文件