Какой файл я должен передать как аргумент pathname ftok()

это упоминается в руководстве ftok ()

key_t ftok(const char *pathname, int proj_id);

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

Я смущен const char *pathname.

что было бы лучшей практикой для этого? По моей текущей системе я могу пройти "/home/Andrew/anyfile" но не возможно, что другие системы, на которых должна работать моя программа, будут иметь этот файл.

как насчет I использовать "/etc/hosts/" или "/etc/inittab" потому что я уверен, что все такие системы будут иметь эти два файла? Это хорошая идея? Может ли это вызвать какие-либо проблемы?

Я не хочу, чтобы попросить пользователя ввести имя файла во время выполнения или передать имя файла в качестве аргумента командной строки.

есть ли другой другой и лучший способ решить pathname?
Какой путь самый лучший и надежный?

Спасибо за ваше время.

4 ответов


Ну, как правило, вы должны использовать файл, связанный с самим приложением.

например, у нас было приложение, которое загрузило файл конфигурации в общую память (в проанализированном эффективно доступном виде-подумайте о XML-файле, который был превращен в структуры в памяти с быстрыми указателями и т. д.), И мы создали сегмент общей памяти из ftok выведена из самого файла конфигурации.

худшем случае, если у вас нет конфигурации файлы для вашего приложения, попробуйте использовать сам исполняемый. Вы можете быть уверены, что он существует в системе где-то (так как вы его запускаете).

вы также не ограничены файлами, вы можете использовать или /tmp или даже / если нужно.

Я говорю: "если вы должны", потому что это немного опасно. The ftok вызов даст вам уникальный ключ на основе спецификации файла и вашего идентификатора. Если вы используете собственные файл, такие как /etc/andrew.conf, вы можете быть уверены, что вы не получите столкновение с любым другим ftok-возвращен ключ.

однако, если вы, и все остальные, решите использовать /tmp как часть спецификации файла, тогда единственным отличием является идентификатор. Следовательно, гораздо проще получить столкновение с другими ключами.

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

Итак, если я нужно 27 семафоров и 15 блоков общей памяти, они все использовать /etc/pax.conf как спецификация файла и идентификаторы от 1 до 42 (и мое приложение знает какой ID относится к какому объекту).


вероятно, лучше всего использовать argv[0] одного из ваших исполняемых файлов. На главной странице написано:"!--2-->

The resulting value is the same for all pathnames that name the same file, ...

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


вы можете динамически создавать char * для пути на основе файла конфигурации или параметра командной строки и т. д.

просто передайте этот символ * в функцию.


использовать "."в качестве первого параметра. Он отправит текущий запущенный каталог в ftok.