#include <stdio.h> #include <sys/sem.h> #include <sys/ipc.h> #include <sys/types.h> #include <errno.h> #include <sys/time.h> #include <time.h>
int main(int argc, char **argv) { int sem_no; key_t key;
/*sem get*/ key = ftok("/home/ddb/study/linux_c/ipc/sem/flag", 1); if((sem_no = semget(key, 1, IPC_CREAT | IPC_EXCL | 0644)) == -1) { printf("semget error! %s\n", strerror(errno)); }
/*sem ctl*/ union semun { int val; struct demid_ds *buf; unsigned short *array; struct seminfo *__buf; }sem_un; sem_un.val = 1; if(semctl(sem_no, 0, SETVAL, sem_un) == -1) { printf("semctl failed! %s\n", strerror(errno)); }
/*sem op*/ struct sembuf buf = {0}; buf.sem_num = 0; buf.sem_op = -1; if(semop(sem_no, &buf, 1) == -1) { printf("semop failed! %s\n", strerror(errno)); } sleep(5); buf.sem_op = 1; if(semop(sem_no, &buf, 1) == -1) { printf("semop2 failed! %s\n", strerror(errno)); } /*del sem*/ int ncnt; sleep(3); if((ncnt=semctl(sem_no, 0, GETNCNT)) == 0) { struct timeval time_buf = {0}; struct timezone time_zone = {0}; if(gettimeofday(&time_buf, &time_zone) == -1) { printf("gettimeofday failed! %s", strerror(errno)); } sleep(20); if(semctl(sem_no, 0, IPC_RMID) == -1) { printf("rm sem failed! %s\n", strerror(errno)); } } printf("---%d\n", ncnt); return 0; }
|