Что такое назначение ftok в очередях сообщений

Я начал читать очереди сообщений одного из механизмов IPC в Linux .Но на самом первом этапе у меня есть несколько основных вопросов.

  1. использование ftok() для генерации уникального идентификатора (ключа) и что такое уникальный идентификатор, который должен быть сгенерирован.

  2. Не можем ли мы использовать простой номер, чтобы получить наши ключи, а не использовать ftok()?

  3. какова цель аргументации key на msget функции?

    #include "sys/msg.h"
    key = ftok("/home/beej/somefile", 'b');
    msqid = msgget(key, 0666 | IPC_CREAT);
    
  4. в чем разница между msqid и key?

3 ответов


на ftok функция создает своего рода идентификатор, который будет использоваться с функциями System V IPC (semget, shmget, msgget). Подумайте об этом как о filedescriptor: когда вы открываете файл, вы передаете путь к open и получить номер, который затем используется для read и write для идентификации файла. The ftok функция служит аналогичной цели, но в то время как область filedescriptor ограничена только процессом, который называется open (и его детей),ftok маркер действует во всей системе.

причина системной области заключается в том, что вы хотите, чтобы два или более независимых процесса имели доступ к одним и тем же ресурсам IPC. Так что если у вас есть две программы, которые выполняют key = ftok("/home/beej/somefile", 'b');, оба получат один и тот же токен и могут получить доступ к одним и тем же ресурсам (семафоры, общая память, очереди сообщений). В этом весь смысл межпроцессного общения.

вы не можете просто использовать "простое число", а вы не знаете, является ли маркер может быть, например, индекс к системной внутренней таблице или что-то еще. Другими словами, вы не знаете, как этот токен используется внутри, поэтому вам нужно использовать ftok.

мужской паж говорит: " указанный путь должен указать существующий файл, доступный вызывающему процессу, иначе вызов завершится ошибкой. Кроме того, обратите внимание, что ссылки на файлы вернут тот же ключ, учитывая тот же идентификатор." из этого я предполагаю, что по крайней мере некоторые ftok реализации создают токен этот номер inode файла, указанного в путь и объедините его со вторым аргументом для создания маркера. Второй аргумент существует просто для того, чтобы вы могли создать кучу ресурсов IPC (например, несколько семафоров для защиты разных ресурсов).

Что касается разницы key_t (значение, возвращенное ftok) и значение, отображаемое msgget: первый дает вам доступ к куче ресурсов IPC (семафор, общая память и очередь сообщений), в то время как later идентифицирует определенную очередь сообщений.


  1. Я не полностью понимаю ваш вопрос, но он генерирует уникальный идентификатор для системы (не процесса) на основе заданного пути к файлу. Этот уникальный идентификатор (привязанный к пути) позволяет различным процессам привязываться к одной и той же очереди сообщений.

  2. Да, вы могли бы, если бы они разработали его таким образом. Но путь к файлу-это более универсальный способ достижения общего детерминированного механизма генерации ключей, который может легко выполнять несколько процессов доступ.

  3. см. 1 & 2

  4. msqid аналогичен дескриптору файла, который вы можете отправлять и получать сообщения в этот дескриптор. Ключ-это то, что позволяет связать ваш крючок в очередь сообщений, которая вас интересует. По аналогии, если ключ находится в пути к файлу в глобальной файловой системе, msqid будет дескриптором вашего процесса для чтения / записи в него.


  1. что?

  2. это может сработать, но какой из них вы выберете и кто гарантирует, что другие программы (или сама система) не будут использовать те же номера? Это приведет к путанице.

  3. цель состоит в том, чтобы предоставить общесистемное уникальное значение для идентификации очереди сообщений. Как утверждает manpage,

    как правило, попытка наилучшего усилия объединяет данный байт proj_id, нижние 16 бит номер индекса и нижние 8 бит номера устройства в 32-битный результат. Коллизии могут легко произойти, например, между файлами на /dev/hda1 и файлами на /dev/sda1.

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

  4. key - Это просто идентификатор, который является уникальным, но может использоваться для других целей, в то время как msqid является ID (вид ручка) для реально существующей очереди.