Ограничение запуска приложения одной копией

В Windows на C++ можно ограничить запуск приложения одной копией следующим образом:

#include <windows.h>

int main(int argc, char *argv[])
{
    HANDLE mutex;
    WCHAR *mtxname = L"MyMutexName";
    if (OpenMutex(MUTEX_ALL_ACCESS, false, mtxname) != 0)
        return -1;
    else
        mutex = CreateMutex(null, false, mtxname);

    // Тело приложения

    ReleaseMutex(mutex);
    return 0;
}

А как такое же можно провернуть в Linux?

mutex он и в Африке mutex

man pthread_mutex_init

Также для этих целей можно использовать семафоры... только нужно ли это(огрничение) во многопользовательской среде?

Оно даже в

Оно даже в однопользовательской сильно мешает. Самые божественно кривые вещи - это приложения под КПК, где почти все программы запускаются в единственном экземпляре и открывают единственный файл. Так хорошо переносить данные из одного текстовика в другой или лазить по инету, когда надо постоянно открывать и закрывать страницы. Что-то можно обойти, но все равно неприятно.

Re: mutex он и в Африке mutex

iRu написал(а):
man pthread_mutex_init

Также для этих целей можно использовать семафоры... только нужно ли это(огрничение) во многопользовательской среде?

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

Насколько я

Насколько я помню это делается при помощи файловой системы. Создаются специальный файлы. Кажется нечто вроде этого:
http://linuxcommand.org/man_pages/lockfile1.html

Всем спасибо! Я

Всем спасибо! Я нашел решение...

#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
  key_t sem_key = 12345678;
  int sem_id;
  union senum
  {
    int val;
    struct semid_ds *buf;
    unsigned short int *array;
    struct seminfo *__buf;
  };
		
  if ((sem_id = semget(sek_key, 1, 0644 | IPC_CREAT | IPC_EXCL)) < 0)
    return -1;

  //  Тело приложения

  union senum ignored_argument;
  semctl(sem_id, 1, IPC_RMID, ignored_argument);
  return 0;
}

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".