头文件
#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);
}
}
}