Пример
Пример
Программа в листинге 3.1 принимает полное имя в качестве аргумента командной строки, вызывает функции stat и ftok, затем выводит значения полей st_dev и st_ino структуры stat и получающийся ключ IPC. Эти три значения выводятся в шестнадцатеричном формате, поэтому легко видеть, как именно ключ IPC формируется из этих двух значений и идентификатора 0x57.
Листинг 3.1[1]. Получение и вывод информации о файле и созданного ключа IPC
//svipc/ftok.c
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 struct stat stat;
6 if (argc != 2)
7 err_quit("usage: ftok <pathname>");
8 Stat(argv[1], &stat);
9 printf("st_dev: &lx, st_ino: %Ix, key: %x ",
10 (u_long) stat.st_dev, (u_long) stat.st_ino,
11 Ftok(argv[1], 0x57));
12 exit(0);
13 }
Выполнение этой программы в системе Solaris 2.6 приведет к следующим результатам:
solaris %ftok /etc/system
st_dev: 800018, st_ino: 4a1b, key: 57018a1b
solaris %ftok /usr/tmp
st_dev: 800015, st_ino: 10b78, key: 57015b78
solaris %ftok /home/rstevens/Mail.out
st_dev: 80001f, st_ino: 3b03, key: 5702fb03
Очевидно, идентификатор определяет старшие 8 бит ключа; младшие 12 бит st_dev определяют следующие 12 бит ключа, и наконец, младшие 12 бит st_ino определяют младшие 12 бит ключа.
Цель этого примера не в том, чтобы впоследствии рассчитывать на такой способ формирования ключа из перечисленной информации, а в том, чтобы проиллюстрировать алгоритм комбинации полного имени и идентификатора конкретной реализацией. В других реализациях алгоритм может быть другим.
ПРИМЕЧАНИЕ
В FreeBSD используются младшие 8 бит идентификатора, младшие 8 бит st_dev и младшие 16 бит st_ino.
Учтите, что отображение, производимое функцией ftok, — одностороннее, поскольку часть бит st_dev и st_ino не используются. По данному ключу нельзя определить полное имя файла, заданное для вычислений.
Данный текст является ознакомительным фрагментом.