Хрестоматия по программированию на Си в Unix



Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 13


#include <sys/stat.h>

void main(ac, av) char *av[]; { struct stat st1, st2; int eq; if(ac != 3) exit(13); stat(av[1], &st1); stat(av[2], &st2); if(eq = (st1.st_ino == st2.st_ino && /* номера I-узлов */ st1.st_dev == st2.st_dev)) /* коды устройств */ printf("%s и %s - два имени одного файла\n",av[1],av[2]); exit( !eq ); }

Наконец, вернемся к склейке нескольких файловых систем в одну объединенную иерархию:

ino=2 *------ корневая файловая система / \ /\ на диске /dev/hd0

/ /\ /\ \ *-/mnt/hd1

: * ino=2 FS на диске /dev/hd1

/ \ (removable FS) /\ \

Для того, чтобы поместить корневой каталог файловой системы, находящейся на диске /dev/hd1, вместо каталога /mnt/hd1 уже "собранной" файловой системы, мы должны издать сисвызов

mount("/dev/hd1", "/mnt/hd1", 0);

Для отключения смонтированной файловой системы мы должны вызвать

umount("/dev/hd1");

(каталог, к которому она смонтирована, уже числится в таблице ядра, поэтому его задавать не надо). При монтировании все содержимое каталога /mnt/hd1 станет недоступным, зато при обращении к имени /mnt/hd1 мы на самом деле доберемся до (безымянного) корневого каталога на диске /dev/hd1. Такой каталог носит название mount point и может быть выявлен по тому признаку, что "." и ".." в нем лежат на разных устройствах:

struct stat st1, st2; stat("/mnt/hd1/.", &st1); stat("/mnt/hd1/..", &st2); if( st1.st_dev != st2.st_dev) ... ; /*mount point*/

Для st1 поле st_dev означает код устройства /dev/hd1, а для st2 - устройства, содержащего корневую файловую систему. Операции монтирования и отмонтирования файловых систем доступны только суперпользователю.

И напоследок - сравнение структур I-узла.

на диске в памяти в вызове stat

<sys/ino.h> <sys/inode.h> <sys/stat.h>

struct dinode struct inode struct stat

// коды доступа и тип файла ushort di_mode i_mode st_mode




Содержание  Назад  Вперед