Преобразование строки в 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);
Другие вопросы по тегам