Преобразование строки в key_t
Как можно преобразовать строку в key_t
, чтобы использовать его для создания сегмента общей памяти с помощью shmget
?
Это связано с тем, что ключ для отображения общей памяти передается по TCP/IP.
Заранее спасибо!
2 ответа
Ключ создается при вызове ftok()
, Последний использует для этого путь к файлу и 8-битное значение.
Для того же пути к файлу и того же значения 8 бит ftok()
(повторно) создает тот же ключ.
Так что передайте путь к файлу и 8-битное значение (обычно другое char
) и пусть получатель позвонит ftok()
на полученные значения. Это создаст тот же ключ, что и отправитель.
От ftok()
Документация:
Функция ftok () использует идентификатор файла с именем по заданному пути (который должен ссылаться на существующий доступный файл) и наименее значимые 8 битов proj_id (который должен быть ненулевым) для генерации ключа IPC System V типа key_t., подходит для использования с msgget (2), semget (2) или shmget (2).
Результирующее значение одинаково для всех путей, которые называют один и тот же файл, если используется одинаковое значение proj_id. Возвращаемое значение должно отличаться, если (одновременно существующие) файлы или идентификаторы проекта отличаются.
Убедитесь, что получатель интерпретирует данные так же, как отправитель поместил их в строку.
Например, если отправитель делает
char buf[32];
*((key_t*)buf) = data;
и отправляет 32-байтовый буфер по сети, получатель должен прочитать их в соответствующий буфер и извлечь key_t
с помощью
data = *((key_t*)buf);