1.1 创建信号量
int semget(
key_t key,
//标识信号量的关键字,有三种方法:1、使用IPC——PRIVATE让系统产生,
// 2、挑选一个随机数,3、使用ftok从文件路径名中产生
int nSemes,
//信号量集中元素个数
int flag //IPC_CREAT;IPC_EXCL
只有在信号量集不存在时创建
)
成功:返回信号量句柄
失败:返回-1
1.2 使用ftok函数根据文件路径名产生一个关键字
key_t ftok(const char *pathname,int
proj_id);
路径名称必须有相应权限
key_t key;
key = ftok(".", 1);
这样就是将fname设为当前目录。
1.3 控制信号量
int semctl(
int semid,
//信号量集的句柄
int semnum, //信号量集的元素数
int
cmd, //命令
/*union senum arg */...
//
)
成功:返回相应的值
失败:返回-1
命令详细说明:
cmd: IPC_RMID 删除一个信号量
IPC_EXCL 只有在信号量集不存在时创建
IPC_SET 设置信号量的许可权
SETVAL 设置指定信号量的元素的值为 agc.val
GETVAL
获得一个指定信号量的值
GETPID 获得最后操纵此元素的最后进程ID
GETNCNT 获得等待元素变为1的进程数
GETZCNT 获得等待元素变为0的进程数
union senum 定义如下:
union senum{
int val;
struct semid_ds *buf;
unsigned short * array;
}agc;
其中 semid_ds 定义如下:
struct semid_ds{
struct ipc_pem
sem_pem; //operation pemission struct
time_t
sem_otime; //last semop()time
time_t
sem_ctime; //last time changed by semctl()
struct
sem *sembase; //ptr to first semaphore in array
struct sem_queue *sem_pending; //pending operations
struct
sem_queue *sem_pending_last; //last pending operations
struct
sem_undo *undo; //undo requests on this arrary
unsigned short int sem_nsems; //number of semaphores in set
};
1.4 对信号量 +1 或 -1 或测试是否为0
int semop(
int semid,
struct sembuf *sops, //指向元素操作数组
unsigned short
nsops //数组中元素操作的个数
)
结构 sembuf 定义
sembuf{
short int sem_num; //semaphore
number
short int sem_op; //semaphore operaion
short int sem_flg //operation flag
};