創(chuàng)建信號(hào)量
int sem_creat(key_t key){
int semid = 0;
semid = semget(key,1,0666| IPC_CREAT | IPC_EXCL);
if(semid == -1){
perror("semget");
if(errno == EEXIST){
printf("檢測(cè)到信號(hào)量集已經(jīng)存在\n");
return 0;
}
}
return semid;
}
打開信號(hào)量
int sem_open(key_t key){
int semid = 0;
semid =semget(key,1,0666);
if(semid == -1){
perror("semget");
return -1;
}
return semid;
}
設(shè)置信號(hào)量的值(資源的個(gè)數(shù))
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 sem_setval(int semid , int val){
int ret =0;
union semun su;
su.val = val;
ret = semctl(semid,0,SETVAL,su);
return ret;
}
獲取信號(hào)量的值
int sem_getval(int semid){
int ret =0;
union semun su;
ret = semctl(semid,0,GETVAL,su);
printf("val:%d\n",su.val);
return ret;
}
信號(hào)量PV操作
int sem_p(int semid){
struct sembuf buf={0,-1,0};
int ret =0;
ret = semop(semid,&buf,1);
return ret;
}
int sem_v(int semid){
struct sembuf buf={0,1,0};
int ret =0;
ret = semop(semid,&buf,1);
return ret;
}
sembuf結(jié)構(gòu)體
{
unsigned short int sem_num; /* semaphore number */
short int sem_op;? /* semaphore operation */
short int sem_flg;? /* operation flag */
};
struct sembuf buf={0,1,0};
信號(hào)量的編好, ?pv操作 P-1 V+1 ,操作0阻塞?