blob: e4e7ea54d9e53faa6068adf92e76c3735973b540 [file] [log] [blame]
#include <sys/sem.h>
#include <sys/ipc.h>
#include <errno.h>
#include "softap_log.h"
//´Ë´¦È¡ÖµÓëFLUXSTATÎļþÖеÄȡֵÊÇÒ»ÖµÄ
//ÓÃÓÚ²»Í¬µÄ½ø³Ì¼äͬ²½
#define TIME_SEM_KEY 0x0666
extern int init_sem(int sem_id, int init_value);
extern int del_sem(int sem_id);
extern int sem_p(int sem_id);
extern int sem_v(int sem_id);
extern int get_sem(key_t sem_key);
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
int get_sem(key_t sem_key)
{
int sem_id = -1;
sem_id = semget(sem_key, 1, 0666 | IPC_CREAT | IPC_EXCL);
if (sem_id < 0) {
//printf("[goahead]semget errno=%d\n", errno);
if (errno == EEXIST) {
//printf("[goahead]semget already exist==\n");
return semget(sem_key, 1, 0666 | IPC_CREAT);
}
slog(MISC_PRINT, SLOG_ERR,"[goahead]semget == -1, return fail\n");
return -1;
}
union semun sem_union;
sem_union.val = 1;
if (semctl(sem_id, 0, SETVAL, sem_union) == -1) {
return -1;
}
//printf("[goahead]semget sem_id= %d, get sem success\n",sem_id);;
return sem_id;
}
// ½«ÐźÅÁ¿sem_idÉèÖÃΪinit_value
int init_sem(int sem_id, int init_value)
{
union semun sem_union;
sem_union.val = init_value;
if (semctl(sem_id, 0, SETVAL, sem_union) == -1) {
return -1;
}
return 0;
}
// ɾ³ýsem_idÐźÅÁ¿
int del_sem(int sem_id)
{
union semun sem_union = {0}; //cov h
if (semctl(sem_id, 0, IPC_RMID, sem_union) == -1) {
return -1;
}
return 0;
}
// ¶Ôsem_idÖ´ÐÐp²Ù×÷
int sem_p(int sem_id)
{
struct sembuf sem_buf;
sem_buf.sem_num = 0; //ÐźÅÁ¿±àºÅ
sem_buf.sem_op = -1; //P²Ù×÷
sem_buf.sem_flg = SEM_UNDO; //ϵͳÍ˳öǰδÊÍ·ÅÐźÅÁ¿£¬ÏµÍ³×Ô¶¯ÊÍ·Å
if (semop(sem_id, &sem_buf, 1) == -1) {
return -1;
}
return 0;
}
// ¶Ôsem_idÖ´ÐÐV²Ù×÷
int sem_v(int sem_id)
{
struct sembuf sem_buf;
sem_buf.sem_num = 0;
sem_buf.sem_op = 1; //V²Ù×÷
sem_buf.sem_flg = SEM_UNDO;
if (semop(sem_id, &sem_buf, 1) == -1) {
return -1;
}
return 0;
}