Функция ftok
создает своего рода идентификатор для использования с функциями System V IPC (semget
, shmget
, msgget
). Думайте об этом как о файловом дескрипторе: когда вы открываете файл, вы передаете путь к open
и получаете взамен число, которое затем используется для read
и write
для идентификации файла. Функция ftok
служит аналогичной цели, но хотя область действия файлового дескриптора ограничена только процессом, который вызвал open
(и его дочерние элементы), токен ftok
действителен во всей системе.
Причина системной области состоит в том, что вы хотите, чтобы два или более независимых процесса имели доступ к одним и тем же ресурсам IPC. Таким образом, если у вас есть две программы, каждая из которых выполняет key = ftok("/home/beej/somefile", 'b');
, обе получат один и тот же токен и смогут получить к ним доступ к одним и тем же ресурсам (семафоры, общая память, очереди сообщений). В этом весь смысл межпроцессного взаимодействия.
Вы не можете просто использовать «простое число», поскольку вы не знаете, может ли токен быть, например, индексом внутренней системной таблицы или чего-то еще. Другими словами, вы не знаете, как этот токен используется внутри, поэтому вам нужно использовать ftok
.
Справочная страница говорит: "Указанный путь должен указывать существующий файл, который доступен для вызывающего процесса, иначе вызов не удастся. Также обратите внимание, что ссылки на файлы возвращают тот же ключ, если тот же идентификатор . " Исходя из этого, я предполагаю, что, по крайней мере, некоторые реализации ftok
создают токен, ища номер инода файла, указанного в path , и объединяют его со вторым аргументом для создания токена. Второй аргумент существует просто для того, чтобы вы могли создать кучу ресурсов IPC (например, несколько семафоров для защиты разных ресурсов).
Что касается разницы key_t
(значение, возвращаемое ftok
) и значения, восстановленного msgget
: первый дает вам доступ к группе ресурсов IPC (семафор, общая память и очередь сообщений), в то время как последний идентифицирует конкретную очередь сообщений.