Какой файл я должен передать как аргумент 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 * для пути на основе файла конфигурации или параметра командной строки и т. д.
просто передайте этот символ * в функцию.