linux多进程(信号量)(三)

信号量概念

当多个进程对一个资源进行访问的时候,我们要对这几个进程进行控制。我们要考虑到他们的同步问题,就需要控制当某个进程占用资源的时候其他进程不能进行访问,信号量就被发明了。

信号量只有两个操作:等待和信号,设有一信号量为SV,分别用P
和V来代替两个操作。
信号量的值是用二进制来表示,只有1和0,就是可执行和不可。
如果当信号量的值为1时(可执行),如果此时A进入到P(SV)操
作那么A就进入进行关键代码段,此时B再执行P(SV)的话就会被
挂起直到A离开关键代码段才将B唤醒进入关键代码段,此时其他进
程进入P(SV)操作的话会进入同B进程一样的过程。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210227154517581.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1ODMzNDA5,size_16,color_FFFFFF,t_70

信号量的函数

IPC键值

system v IPC都会有自己的键值,我们用ftok来创建他的键值。

key_t ftok(const char* path, int id);
path文件路径   id去0-255之间作为他的ID
失败返回-1

semget

获得信号量集的id

int  semget(key_t key, int nums, int flag);
1.key是一个将要打开的信号量集的名字。
2.nums是指信号量的个数。
3.flag是指控制字段和权限,低9位bit指定权限,控制字段IPC_CREAT和IPC_EXCL。
4.返回信号量集的semid,失败返回-1.

semop

获取信号量集的函数


struct sembuf
{
	short sem_num;//信号量集号
	short sem_op;		//信号量集操作 <0 >0 =0
	short sem_flag;	//操作标识符,一般为0
};
int semop(int semid, struct sembuf* opstr, size_t num);
num为opstr数组当中的个数

semctl

信号机控制函数

struct semun
{
	int val;				//仅用于SETVAL命令
	struct semid_ds *buf;	//仅用于ICP_SET命令
	ushort *array;			//仅用于SETALL命令
};
int semctl(int semid, int semnum, int cmd, union semun arg);
1.semnum指定信号量集中的第几个信号量。
2.cmd代表命令的值.
3.arg取决于cmd,当cmd为以上命令时候就可要使用.

一些semctl的控制命令

IPC_STAT //将与semid关联的内核数据结构拷贝到由arg.buf指针指向的内存区。
IPC_SET //将由arg.buf指针指向的semid_ds的一些成员写入相关联的内核数据结构,同时更新它的sem_ctime成员。
IPC_RMID //立即删除信号集,唤醒所有被阻塞的进程。
IPC_INFO //Linux特有命令,返回系统范围内关于信号集的制约和其它参数,并存放在arg.__buf指向的内存区。其结构形态如下
SEM_INFO //返回和IPC_INFO相同的信息,不同点有:semusz字段包含有当前系统存在的信号集总量。semaem字段包含有系统内所有信号集的信号总量。
SEM_STAT //返回和IPC_STAT相同的信息。不过参数semid不是一个信号集标识,而是内核内部维持所有信号集信息的数组索引。
GETALL //将所有信号的值存入semun.array中。
GETNCNT //等待信号值增加的进程的总数。
GETPID //前一个对此信号进行操作的进程的识别码。
GETVAL //根据semnun返回信号的值。
GETZCNT //等待信号值变为0的进程的总数。
SETALL //将所有semun.array的值设定到信号集中。
SETVAL //根据semun设定信号的值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值