| #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; |
| } |
| |