【问题标题】:MINIX: Retrieve a file's inode by the filenameMINIX:通过文件名检索文件的 inode
【发布时间】:2016-09-18 02:29:34
【问题描述】:

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 mask denied SENDREC from 1 to 1

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

提前致谢。

【问题讨论】:

    标签: linux-kernel system-calls stat minix


    【解决方案1】:

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

    对应的系统函数是do_stat,也不能用于你的目的。

    最终,您在虚拟文件服务器中所需的所有文件处理功能都可以追溯到 lookupadvance

    如果我们检查一下 VFS 目录中的 path.c 文件,我们最终会发现 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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 2017-05-06
      • 2018-11-11
      • 2016-07-05
      • 2017-01-14
      • 2011-05-21
      • 2020-11-27
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多