- 创建信号量
1.创建关键字:ftok函数
头文件:
#include<sys/ipc.h>
函数原型:key_t ftok(const char *pathname,int proj_id);
参数1:文件名
参数2:
返回值:出错返回-1,正确返回一个关键字
2.创建或得到一个信号量集的标识符:semget函数
头文件:
#include<sys/ipc.h> #include<sys/sem.h>
函数原型:int semget(key_t key,int nsems,int semflg);
函数作用:得到一个信号量集标识符或创建一个信号量集对象并返回信号量集的标识符
参数1:ftok得到的关键字
参数2:创建信号量集的个数,只在创建信号量集时有效
参数3:标记。0:去信号量集的标识符,若不存在则函数会报错; IPC_CREAT:当semflg&IPC_CREAT为真时,如果内核中不存在减值与key相等的信号量集,则创建一个新的信号量集;若果存在这样的信号量集则返回此信号量集的标识符;IPC_CREAT|IPC_EXCL:如果内核中不存在减值与key相等的信号量集,则创建一个信号集;如果存在这样的信号量集则报错。 一般为:IPC_CREAT|IPC_EXCL|0755
表示如果没有就创建并将权限设为0755,如果有就报错
返回值:出错返回-1,正确返回信号量集的标识符
//create_sem.c
1 #include"../ipc.h"//该头文件只是引入相应的头文件,以及对ftok、semget、semop进行包裹,在下列代码中这三个函数以大写字母开头的是他们的包裹函数,其包裹函数只是对其返回值做出相应的操作。
2
3
4 //1.利用ftok函数产生关键字key。
5 //2.利用semget函数创建或打开IPC通道
6
7 int main(int argc,char *argv[])
8 {
9 if(argc!=4)
10 {
11 printf("Error:>Please input %s pathname proj_id nsems!\n ",argv[0]);
12 exit(1);
13 }
14 key_t sem_key=Ftok(argv[1],atoi(argv[2]));//atoi函数是将字符
串转换为整数
15 printf("sem_key = %x\n",sem_key);
16
17 //2.
18 int sem_id=Semget(sem_key,atoi(argv[3]),IPC_CREAT|IPC_EXCL|0 755);
19 printf("sem_id = %d\n",sem_id);
20 return 0;
21 }
- 删除信号量
1.获取关键字:ftok函数
与创建信号量相同。只是应注意pathname和proj_id的值必须与创建信号量时相同
2.获取信号量集的标识符:semget函数
此时semget函数的后两个参数应设为0