头文件
#include<sys/types.h> #include <sys/sem.h>
union semun { int val; /* Value for SETVAL */ struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ unsigned short *array; /* Array for GETALL, SETALL */ struct seminfo *__buf; /* Buffer for IPC_INFO (Linux-specific) */ }; int create_sem(){ key_t key(ftok("..", 2)); int semid = semget(key, 1, IPC_CREAT | IPC_EXCL | 0600); //Create one sem if(semid < 0){ print("Crate sem Error"); return -1; } print("semid:", semid); semun semun1; semun1.val = 1; semctl(semid, 0, SETVAL, semun1); //init return semid; } int get_sem(){ key_t key(ftok("..", 2)); int semid = semget(key, 0, 0); //Reference a sem,Set nsems to 0 if(semid < 0){ print("Get sem Error"); return -1; } return semid; } void P_sem(int semid){ //get source sembuf P_sembuf; P_sembuf.sem_num = 0; //index of信号量,你想操作的信号量的下标 P_sembuf.sem_op = -1; P_sembuf.sem_flg = SEM_UNDO; semop(semid, &P_sembuf, 1); } void V_sem(int semid){ //release source sembuf V_sembuf; V_sembuf.sem_num = 0; V_sembuf.sem_op = 1; V_sembuf.sem_flg = SEM_UNDO; semop(semid, &V_sembuf, 1); } void sem_test(){ pid_t pid; if((pid = fork()) > 0){ int semid = create_sem(); for(int i = 0; i < 3; i++){ P_sem(semid); print("A"); fflush(stdout); sleep(1); V_sem(semid); } cout << semctl(semid, 0, IPC_RMID); //delete sem wait(0); }else if(pid == 0){ int semid = get_sem(); for(int i = 0; i < 3; i++){ P_sem(semid); print("B"); fflush(stdout); sleep(1); V_sem(semid); } } }
更多:https://www.cnblogs.com/lenomirei/p/5649792.html