Получение уникального идентификатора из Unix-подобной системы - PullRequest
22 голосов
/ 30 ноября 2008

Я хочу получить из любой Unix-подобной системы (если это возможно) уникальный идентификатор, который будет постоянным каждый раз, когда мое приложение запускается на той же машине. Если это возможно, я хочу получить тот же идентификатор из Linux, FreeBSD, Solaris и т. Д. Я не хочу генерировать новый идентификатор для каждой машины, но получаю уже существующий идентификатор, и я предпочитаю этот идентификатор происходят из операционной системы, и я не предпочитаю использовать что-то вроде MAC-адреса.

Если нет другой доступной опции, я могу использовать MAC в сочетании с чем-то другим, например, id может быть хешем md5 комбинации MAC-адреса и чего-то еще.

Я бы хотел выслушать ваши предложения.

Если это полезно, мое приложение написано на C / C ++.

Цель всего этого - не дать пользователю запускать мое приложение два или более раз. Я хочу бежать только один раз.

Ответы [ 14 ]

0 голосов
/ 05 декабря 2008

Вы можете использовать файл блокировки в таких местах, как:

  • / var / run / yourapp.pid (если программа запускается пользователем root)
  • $ HOME / .yourapp.pid (если запускается пользователем и локальной файловой системой)
  • $ HOME / .yourapp. $ (Имя хоста -f) .pid (home на nfs)

Когда ваша программа запускается, она должна делать что-то вроде:

lock = open(filename, O_CREAT | O_EXCL);
dprintf(lock, "%u", getpid());

Если открытие не удалось, проверьте, запущен ли еще процесс, а если нет: удалите файл и попробуйте снова.

0 голосов
/ 04 декабря 2008

Вы упомянули, что в Windows вы используете какой-то GUID ... У вас есть некоторые подробности о том, как он создается?

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

0 голосов
/ 30 ноября 2008

Большинство unix-подобных машин имеют генератор случайных чисел, доступный через / dev / random . Вам понадобится что-то вроде MAC-адреса и времени, чтобы придать подлинную уникальность генератору GUID (это то, что делает генератор GUID в Windows). Кроме того, получение чего-либо из / dev / random даст вам достаточно хорошую конструкцию типа GUID. На практике библиотеки UUID делают подобные вещи негласно.

Если вам нужен только один номер на машину, то, вероятно, будет достаточно MAC-адреса. Они управляются центральным органом, и можно разумно предположить, что никакие два MAC-адреса не будут одинаковыми. Однако, если вы пытаетесь использовать это для привязки установки программного обеспечения к MAC-адресу, имейте в виду, что некоторые компоненты имеют программируемые MAC-адреса или программируемые компоненты MAC-адреса. Unix-подобные операционные системы, особенно с открытым исходным кодом, обычно не имеют аппаратных серийных номеров. Этот подход также может вызвать проблемы с запуском нескольких экземпляров программного обеспечения в виртуальных машинах.

Одной из опций может быть ключ USB , , который можно приобрести у нескольких производителей. Другим вариантом может быть сервер лицензий, где уникальный код предоставляется серверу. Опять же, несколько стандартных решений для этого доступны из разных источников.

0 голосов
/ 30 ноября 2008

Похоже, вы ищете UUID. Это общий универсальный уникальный идентификатор (на самом деле, то же самое, что GUID)

Существует много реализаций этого в C ++ в разных библиотеках, или вы можете использовать команду uuidgen и получить выходные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...