信号量函数的封装

来源:互联网 发布:c语言 if else 嵌套 编辑:程序博客网 时间:2024/05/12 17:13

信号量函数的封装:

sem.h

#ifndef __SEM_H#define __SEM_H#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <assert.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>int semid;union semun{int val;};void sem_get();//创建或获取信号量,如果是初次则创建void sem_p();//p操作,等待void sem_v();//v操作,发送信号void sem_del();//删除信号量#endif

sem.c

#include "sem.h"#include <stdio.h>#include <stdlib.h>#include <assert.h>void sem_get(){semid = semget((key_t)1234, 1, 0664);//直接获取信号量,if(semid == -1)//如果获取失败,则创建信号量{semid = semget((key_t)1234, 1, 0664 | IPC_CREAT);assert(semid != -1);union semun v;v.val = 0;if(-1 == semctl(semid, 0, SETVAL, v)){perror("error");exit(0);}}}void sem_p(){struct sembuf buff;buff.sem_num = 0;buff.sem_op = -1;buff.sem_flg = SEM_UNDO;if(-1 == semop(semid, &buff, 1)){perror("p error");exit(0);}}void sem_v(){struct sembuf buff;buff.sem_num = 0;buff.sem_op = 1;buff.sem_flg = SEM_UNDO;if(-1 == semop(semid, &buff, 1)){perror("p error");exit(0);}}void sem_del(){if(-1 == semctl(semid, 0, IPC_RMID)){perror("del error");exit(0);}}