ftok () столкновения - PullRequest
       26

ftok () столкновения

8 голосов
/ 07 сентября 2011

Я использую ftok() для генерации идентификаторов для сегментов разделяемой памяти, используемых приложением C. У меня возникли проблемы, когда в одном окне я получаю коллизии с идентификаторами, используемыми root. Я могу исправить это в этом случае, взломав код, но я бы хотел более надежное решение.

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

Я обнаружил, что ftok будет делать что-то вроде этого:

(id & 0xff) << 24 | (st.st_dev & 0xff) << 16 | (st.st_ino & 0xffff)

Сочетание st.st_dev / st.st_ino должно быть очень уникальным. Но я видел через несколько блоков, младший значащий бит st_dev часто равен 0 (то есть числа st_dev обычно кратны 256). А поскольку двоичный каталог находится в логическом томе, нет никакой гарантии, что номер инода будет отличаться от того, что использует root.

Есть ли хороший способ обойти это - лучшую альтернативу ftok или способ настройки машин таким образом, чтобы числа st_dev были более полезны для ftok?

Ответы [ 2 ]

7 голосов
/ 07 сентября 2011

Возможно, вы захотите использовать разделяемую память POSIX (через shm_open), которая не страдает от такого рода столкновения клавиш

1 голос
/ 07 сентября 2011

Ваше приложение всегда должно быть в состоянии справиться с ключевыми столкновениями.Ключ может быть использован другим не связанным процессом.Но вы можете попытаться создать свою собственную версию ftok (), используя более релевантные биты.

Теоретически любому приложению требуется только один «главный» ключ, указывающий на «табло», где можно найти другие ключи,Публикация masterkey в файловой системе может быть хорошей идеей.Перезапуск после сбоя всегда будет проблемой.

...