MINIX: получить индексный дескриптор файла по имени файла

В MINIX 3.2.1 я хочу создать новый системный вызов, которому будет присвоено имя файла в качестве параметра и который будет печатать номер инода определенного файла.

Для этого я создал и изменил все необходимые файлы.

Итак, чтобы получить индекс файла по его имени, я хочу использовать системный вызов по умолчанию:

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 внутри моего нового системного вызова? И если да, то есть ли другой способ получить индекс файла по имени файла?

Заранее спасибо.


person thomas_p    schedule 20.05.2016    source источник


Ответы (1)


stat — это системный вызов, содержащий множество основных функций. Вы не можете использовать системный вызов из системной функции из-за самой структуры Minix, которая требует обмена сообщениями между клиентскими и серверными процессами для реализации самого системного вызова.

Соответствующая системная функция: do_stat и также не может быть использован в ваших целях.

В конечном счете, все функции обработки файлов, которые вам нужны в Virtual File Server, отслеживаются до поиска и перехода.

Должны ли мы изучить path.c в каталоге 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;
}

Конечно, другие файлы должны быть созданы или изменены, чтобы реализовать правильный системный вызов.

person Slinky Sloth    schedule 24.07.2017