IPC机制下的信号量sem,以及ftok、semget、semctl、semop函数

本文详细介绍了在IPC机制下,如何使用ftok函数创建关键字,semget函数创建或获取信号量集标识符,semctl函数用于删除信号量、修改和获取信号量值,以及semop函数进行P、V操作。这些函数在多进程间同步和通信中起到关键作用。
摘要由CSDN通过智能技术生成

这里写图片描述
- 创建信号量
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值