在MINIX 3.2.1中,我想创建一个新的系统调用,它将被指定一个文件名作为参数,并打印特定文件的索引节点号。
我已经创建并修改了所有需要的文件。
因此,为了根据文件的名称检索文件的inode,我想使用默认的系统调用:
int stat(char *name, struct stat *buffer)
http://minix1.woodhull.com/manpages/man2/stat.2.html
在我的新系统调用处理程序的主体中
/usr/src/servers/vfs/misc.c
内的int mycall_1(void);
但是,当我编译并尝试测试新的系统调用时,在应该调用stat
系统调用的地方,它实际上不会,而是打印消息:
sys_call: ipc mask denied SENDREC from 1 to 1
那么,在我的新系统调用中禁止使用stat
吗?如果是,有没有其他方法可以通过文件名检索文件的索引节点?
提前谢谢。
stat是一个包含许多核心函数的系统调用。您不能在系统函数中使用系统调用,因为Minix的结构需要在客户端和服务器进程之间交换消息,以便实现系统调用本身。
相应的系统功能是do_stat,也不能用于您的目的。
最终,您在虚拟文件服务器中需要的所有文件处理功能都可以追溯到查找和前进。
如果我们检查VFS目录中的path.c文件,我们最终会发现lookup_init和eat_path是最合适的函数。在下面的示例中,第一个初始化/准备查找结构的节点详细信息,而后面的依赖于前进并解析节点的给定路径。
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: %dn”, vp->v_inode_nr);
else printf(“inode: -n”);
return 0;
}
当然,还必须创建或修改其他文件才能实现正确的系统调用。