Необходимо проверить, является ли данный экземпляр процесса едиственным. Пробую реализовать с помощью семафора Код (Text): int UniqueInstance() { key_t key = 0x12345678; int sem; if( ( sem = semget( key, 1, 0666 | IPC_CREAT ) == -1 ) ) { return( 0 ); } //пробую "захватить" семафор struct sembuf sbuf; sbuf.sem_num = 0; sbuf.sem_op = 0; sbuf.sem_flg = IPC_NOWAIT; if( semop( sem, &sbuf, 1 ) == -1 ) { return( 0 ); } //увеличиваю значение на 1 sbuf.sem_num = 0; sbuf.sem_op = 1; sbuf.sem_flg = IPC_NOWAIT | SEM_UNDO; return( semop( sem, &sbuf, 1 ) == 0 ); } Возвращает ошибку EIDRM - The semaphore set was removed.
psu а где инициализация семафора? вновь созданный процесс завершается, если он - не единственный работающий экземпляр?
Инициализация? хм.. наверное, чего-то не дочитал. Первый раз в первый класс.. Да, процес завершается --- Пробую с именнованым семафором тоже самое сделать Код (Text): static sem_t* g_sem; int main( int argc, char* argv[] ) { if( !UniqueInstance() ) { Error( "Already running" ); return( 0 ); } sem_unlink( g_sem ); return( 0 ); } int UniqueInstance() { g_sem = sem_open( "mysemaphore", O_CREAT | O_EXCL, 0666, 0 ); return( g_sem != SEM_FAILED ); } Все равно не работает
Код (Text): int check_self(key_t key) { int sem_id; struct semid_ds buf; struct sembuf sembuf = {0, -1, IPC_NOWAIT}; union semun semun; sem_id = semget(key, 1, IPC_CREAT | IPC_EXCL | 0666); if (sem_id < 0) { if (errno == EEXIST) { if ((sem_id = semget(key, 1, 0666)) < 0) return errno; } while (1) { semun.buf = &buf; if (semctl(sem_id, 0, IPC_STAT, semun) < 0) return errno; if (semun.buf -> sem_ctime == 0) continue; break; } } else { semun.val = 1; semctl(sem_id, 0, SETVAL, semun); } if (semop(sem_id, &sembuf, 1) < 0 && errno == EAGAIN); _exit(errno); return 0; }