Какова цель ftok в очереди сообщений - PullRequest
9 голосов
/ 09 сентября 2011

Я начал читать очереди сообщений, один из механизмов 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 ]

23 голосов
/ 09 сентября 2011

Функция 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 (семафор, общая память и очередь сообщений), в то время как последний идентифицирует конкретную очередь сообщений.

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

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

  3. См. 1 & 2

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

0 голосов
/ 09 сентября 2011
  1. Что?

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

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

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

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

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

...