LINUX.ORG.RU

ftok()


0

0

Хочу поделится решением проблемы которая у меня возникла с ftok(). Есть два приложения A и B, они должны общаться между собой и значит получать ключи посредством ftok(). Получать ключи в обход ftok() нельзя поскольку они могут конфликтовать с ключами уже выданными ftok() другим программам. Пар типа A и B множество. Каждой паре A и B передается одинаковый (для данной пары, но не для множества пар) параметр (текстовая строка типа URL). Вопрос как получить ключ от ftok(). Можно манипулировать первым ее агументом (что в данном случае не подходит либо вторым который размером только char :( В linux он правда объявлен как int но используется все равно только младший байт (я специально смотрел в ядре). Можно конечно передавать каждой паре A и B этот аргумент для ftok() (типа 'a', 'b', 'c'...), но я понял что самое простое в данном случае написать библиотеку которой A и B будут передавать свои аргументы (типа URL), библиотека будет считать их хеш, класть в массив и индекс массива использовать в качестве второго аргумента ftok(), получать ключ и отдавать A и B. Хеш нужен чтобы проверять нет ли уже такого элемента массива. Вот такое примитивное, но эффективное решение данной проблемы, которое однако пришло в мою тупую голову не сразу. Может кому поможет...

anonymous

А зачем вообще использовать ftok()? Тип key_t - это некоторый целый тип, так не лучше ли просто посчитать какой-либо хэш по передаваемому URL и использовать его в качестве ключа key_t?

ftok() в ядре??? Вы что-то путаете... Кроме того, первый аргумент ftok() должен быть существующим файлом (как пишется в man ftok). В общем-то ftok() - это костыль, придуманный чтобы хоть как-то компенсировать изначальный design fault, что объекты IPC никак не отображаются в файловой системе.

anonymous
()
Ответ на: комментарий от anonymous

Не в ядре конечно а в libc.

>>так не лучше ли просто посчитать какой-либо хэш по передаваемому URL и >>использовать его в качестве ключа key_t?
А где гарантия что ftok УЖЕ не выдала этот ключ другому процесу ?!
Приходится извращатся через ftok() :(

anonymous
()
Ответ на: комментарий от anonymous

А нельзя создавать объект с ключём IPC_EXCL, и если он уже существует прибавить к ключу некоторое фиксированное значение, и так, пока не будет найден свободный ключ?

anonymous
()
Ответ на: комментарий от anonymous

Можно конечно, а что если ftok хранит где-либо выданные ключи и таким образом не учтем присвоенный нами самовольно ключ, выдаст его кому-нибудь и тот обломается ?
Блин кривой механизм этот ftok() :(

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.