MINIX:按文件名检索文件的inode

时间:2016-05-20 18:08:38

标签: linux-kernel system-calls stat minix

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

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

因此,为了按名称检索文件的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吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

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

最终,虚拟文件​​服务器中所需的所有文件处理功能都会追溯到查找提前

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

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