2013-05-20 4 views
0

У меня есть существующий код в системе, который использует ftok() для генерации ключа на основе имени файла и нулевого значения, переданного ему. Код работал нормально на 32 бит, но при случайном перемещении на 64 бит запускает жалобы. Изучая больше, я обнаружил, что это в основном из-за того, что младшие биты знака равны нулю, а shmopen() может быть лучшей альтернативой. Дайте мне знать, делает ли shmopen() безопасным от ключевых столкновений? Есть ли лучший способ избежать ключевых столкновений?Повторяющиеся ключи с использованием ftok()

key = ftok(filename,0); 
+0

Я полагаю, что вы имеете в виду 'shm_open'? «Ключ» - это то, что делает его уникальным, поэтому вы сами позаботились об этом. Вы можете проверить, выполнено ли уже заданное имя с помощью флагов 'O_CREAT | O_EXCL'. –

ответ

1

Из POSIX specification: функции

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

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

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

+0

действительно ли изменение последнего аргумента отличным от нуля гарантирует генерацию уникальных ключей? У нас есть лучшая альтернатива, я просто google и обнаружил, что shmopen() есть, но я не уверен в этом. –

+0

@SachinChourasiya В спецификации ясно, что изменение аргумента id изменит возвращаемый ключ. Кроме того, я думаю, вы имеете в виду ['shm_open'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/shm_open.html) (обратите внимание на подчеркивание)? Если вы собираетесь использовать общую память, тогда да, я рекомендую использовать вариант POSIX ('shm_open') перед старым вариантом SYSV (' ftok'/'shmget' и т. Д.). –

+0

Yup, я имею в виду shmopen(). Спасибо, Иоахим. Я попробую использовать другое целое число, чтобы получить уникальный идентификатор ключа. –

Смежные вопросы