Какой файл я должен передать в качестве аргумента pathname функции ftok () - PullRequest
10 голосов
/ 01 июля 2010

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

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

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

Я в замешательстве по поводу const char *pathname.

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

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

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

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

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

Ответы [ 4 ]

14 голосов
/ 01 июля 2010

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

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

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

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

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

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

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

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

3 голосов
/ 01 июля 2010

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

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

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

1 голос
/ 01 июля 2010

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

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

0 голосов
/ 27 марта 2018

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

...