在 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吗?
提前致谢。
答案 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;
}
当然,还必须创建或修改其他文件以实现正确的系统调用。