Процесс: double instance check

Тема в разделе "WASM.UNIX", создана пользователем psu, 12 июн 2007.

  1. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    Необходимо проверить, является ли данный экземпляр процесса едиственным. Пробую реализовать с помощью семафора
    Код (Text):
    1. int UniqueInstance()
    2. {
    3.     key_t key = 0x12345678;
    4.     int sem;
    5.     if( ( sem = semget( key, 1, 0666 | IPC_CREAT ) == -1 ) )
    6.     {
    7.         return( 0 );
    8.     }
    9.  
    10. //пробую "захватить" семафор
    11.     struct sembuf sbuf;
    12.     sbuf.sem_num = 0;
    13.     sbuf.sem_op = 0;
    14.     sbuf.sem_flg = IPC_NOWAIT;
    15.     if( semop( sem, &sbuf, 1 ) == -1 )
    16.     {
    17.         return( 0 );
    18.     }
    19.    
    20. //увеличиваю значение на 1
    21.     sbuf.sem_num = 0;
    22.     sbuf.sem_op = 1;
    23.     sbuf.sem_flg = IPC_NOWAIT | SEM_UNDO;
    24.     return( semop( sem, &sbuf, 1 ) == 0 );
    25. }
    Возвращает ошибку EIDRM - The semaphore set was removed.
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    psu
    а где инициализация семафора?
    вновь созданный процесс завершается, если он - не единственный работающий экземпляр?
     
  3. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    Инициализация? хм.. наверное, чего-то не дочитал. Первый раз в первый класс.. :)
    Да, процес завершается

    ---

    Пробую с именнованым семафором тоже самое сделать

    Код (Text):
    1. static sem_t*       g_sem;
    2. int main( int argc, char* argv[] )
    3. {
    4.     if( !UniqueInstance() )
    5.     {
    6.         Error( "Already running" );
    7.         return( 0 );
    8.     }
    9.     sem_unlink( g_sem );
    10. return( 0 );
    11. }
    12. int UniqueInstance()
    13. {
    14.     g_sem = sem_open( "mysemaphore", O_CREAT | O_EXCL, 0666, 0 );
    15.     return( g_sem != SEM_FAILED );
    16. }
    Все равно не работает :dntknw:
     
  4. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Код (Text):
    1. int check_self(key_t key) {
    2.     int sem_id;
    3.     struct semid_ds buf;
    4.     struct sembuf sembuf = {0, -1, IPC_NOWAIT};
    5.     union semun semun;
    6.     sem_id = semget(key, 1, IPC_CREAT | IPC_EXCL | 0666);
    7.     if (sem_id < 0) {
    8.         if (errno == EEXIST) {
    9.             if ((sem_id = semget(key, 1, 0666)) < 0)
    10.                 return errno;
    11.         }
    12.         while (1) {
    13.             semun.buf = &buf;
    14.             if (semctl(sem_id, 0, IPC_STAT, semun) < 0)
    15.                 return errno;
    16.             if (semun.buf -> sem_ctime == 0)
    17.                 continue;
    18.             break;
    19.         }
    20.     } else {
    21.         semun.val = 1;
    22.         semctl(sem_id, 0, SETVAL, semun);
    23.     }
    24.     if (semop(sem_id, &sembuf, 1) < 0 && errno == EAGAIN);
    25.         _exit(errno);
    26.     return 0;
    27. }