Что такое независимый от платформы способ получения уникального значения текущего экземпляра (например, pid) в C

#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: