#c #platform-independent
#c #не зависит от платформы
Вопрос:
Я хотел бы получить какой-то вид (не имеет значения, является ли это идентификатором процесса или чем-либо еще) уникального целочисленного значения текущего экземпляра в C независимым от платформы образом (это означает отсутствие макропереключателя #if #else).
значение, основанное на времени, не будет надежным, поскольку два экземпляра могут запускаться одновременно.
Есть ли какой-либо способ достичь этого?
РЕДАКТИРОВАТЬ: это не обязательно должно быть глобально уникальным. он просто должен быть уникальным в масштабах всей системы.
Комментарии:
1. Возможно, я неправильно понимаю, но вы хотите присвоить уникальные идентификаторы каждому экземпляру вашей запущенной программы? Не могли бы вы сделать что-то вроде того, чтобы каждое приложение генерировало UUID при запуске и использовало его в качестве идентификатора экземпляра?
2. umm uuid на основе чего? время? идентификатор оборудования?
3. Я полагаю, что другие платформы имеют эквивалент hwnd в Windows. Просто создайте целочисленный тип, который будет соответствовать им всем, и введите туда этот идентификатор процесса.
4. Используйте
boost::uuid
, который поддерживает 5 различных версий UUID, и я думаю, что по умолчанию используется версия 4, которая основана на случайных числах и потенциально не идентифицирует информацию о вашей системе.5. Хм .. Я бы предпочел использовать переключатель #if # else, чем использовать стороннюю библиотеку (слишком тяжелую и излишнюю)… В конечном итоге я приму ответ, если нет ни одного, который использует встроенную библиотеку C (также C, если таковой не существует), но ответы без использования сторонней библиотеки были бы с благодарностью приняты 🙂
Ответ №1:
Взгляните на процесс Boost. Может быть именно то, что вы ищете. Если вы не хотите включать библиотеку, вы можете взглянуть на то, как реализована функциональность.
Комментарии:
1. Да, именно так ! Выдержка из boost_process/boost/process/self.hpp:
self() : #if defined(BOOST_POSIX_API) process(::getpid()) #elif defined(BOOST_WINDOWS_API) process(::GetCurrentProcessId()) #endif { }
2. В настоящее время self.hpp исчез; вызов был заменен на
boost::this_process::get_id()
Ответ №2:
Короче говоря, ответ отрицательный, не без использования функциональности, зависящей от платформы.
[C 03]
Сам язык C не предоставляет никакого механизма для этого. Фактически, сам C ничего не знает о процессах или межпроцессном взаимодействии. Без использования функциональности, зависящей от платформы — либо созданной вами вручную, что означает #ifdef
s, либо в какой-либо кроссплатформенной библиотеке 3-й части, такой как Boost, что также означает #ifdef
s — это невозможно сделать.
…и…
[C 11]
Язык C имеет базовую концепцию потоков, но он не предоставляет механизма (который я вижу) для создания механизма межпроцессной связи, поэтому вышеуказанное все еще применяется.
Ответ №3:
Это может быть излишним, но взгляните на QUuid
Ответ №4:
Я думаю, вам нужен универсальный уникальный идентификатор