Это упоминается в ftok () руководство
key_t ftok(const char *pathname, int proj_id);
ftok () функция использует идентификационные данные файла, названного данным путем (который должен относиться к существующему, доступному файлу)...
Я смущен const char *pathname
.
Какова была бы лучшая практика для него? На моей существующей системе я могу передать "/home/Andrew/anyfile"
но не возможно, что другие системы, над которыми должна работать моя программа, будут иметь этот файл.
Как насчет я использую "/etc/hosts/"
или "/etc/inittab"
потому что я уверен, что все такие системы будут иметь эти два файла? Действительно ли это - хорошая идея? Это может вызвать какую-либо проблему?
Я не хочу просить, чтобы пользователь ввел имя файла во время выполнения или передал имя файла как параметр командной строки.
Есть ли любой другой другой и лучший способ решить pathname
?
Каким путем является лучший и самый надежный?
Спасибо за внимание.
Как правило, вы бы использовали файл, связанный с само приложение.
Например, у нас было приложение, которое загружало файл конфигурации в общую память (анализируемым и эффективно доступным способом - подумайте о XML-файле, который был преобразован в структуры в памяти с быстрыми указателями и т. Д.), И мы создали сегмент разделяемой памяти из ftok
, полученный из самого файла конфигурации.
В худшем случае, если у вас нет файлов конфигурации для вашего приложения, попробуйте использовать сам исполняемый файл. Вы можете быть уверены, что он где-то существует в системе (раз уж вы его используете).
Вы также не ограничены файлами, вы можете использовать сам / etc
или / tmp
или даже /
, если необходимо.
Я говорю «если надо», потому что это немного опасно. Вызов ftok
даст вам уникальный ключ на основе спецификации вашего файла и вашего идентификатора. Если вы используете свой собственный файл, такой как /etc/andrew.conf
, вы можете быть достаточно уверены, что не столкнетесь ни с одним другим ftok
-вернутый ключ.
Однако, если вы и все остальные решите использовать / tmp
в качестве части спецификации файла, то единственным отличием будет идентификатор. Следовательно, намного легче столкнуться с другими клавишами.
Я всегда использовал спецификацию файла как действительно уникальное значение для моего приложения, а затем просто использовал идентификатор для конкретной вещи, которую я хочу создать.
Итак, если мне нужно 27 семафоров и 15 блоков разделяемой памяти, они все используют /etc/pax.conf
как спецификацию файла и идентификаторы от 1 до 42 (и мое приложение знает , какой идентификатор относится к какому объекту).
Вероятно, лучше всего использовать argv [0] одного из ваших исполняемых файлов. На странице руководства написано
The resulting value is the same for all pathnames that name the same file, ...
, так что вы должны быть в безопасности, даже если ваш исполняемый файл иногда вызывается через символическую ссылку или около того.
Вы можете динамически создать символ * для пути на основе файла конфигурации, параметра командной строки и т. Д.
Просто передайте этот символ * в функцию.