210226阶段三 systemV信号量

该博客记录了学习的知识点,包括线程、互斥锁、信号量等属于POSIX相关,而systemV信号量用于进程间,有P、V操作。服务器按功能分为前置和后置进程,使用两块共享内存和两个systemV信号量处理数据,避免抢夺P操作。还提及无未理解之处及当天学习收获。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、学习的知识点

  1. 线程属于POSIX线程
  2. 互斥锁、信号量属于POSIX信号量 在进程内部使用
  3. systemV信号量: semget shmget 在进程间使用
  4. 通过ipcs查看的都是systemV系列
  5. 信号量都是对一个数字进行加一减一的操作,信号量为 0 时,若进行减一,则阻塞在此,
  6. systemV系列的P操作对信号量减1,V操作对信号量加1

服务器

根据服务器的功能分为两个进程

前置服务器(接入服务器)

接入客户端,把数据写入共享内存,通知后置服务器取数据

后置服务器(业务处理服务器)

取出数据,对数据进行处理,写入共享内存,通知前置服务器取

使用两块共享内存 两个systemV信号量 一个共享内存 存放未处理的数据,另一个共享内存存放处理后的数据。
使用两个信号量的原因是:避免后置服务器和子进程抢夺 信号量的P操作

systemV信号量

#include <sys/types.h> //man semop
#include <sys/ipc.h>
#include <sys/sem.h>
void sem_p(int sem_id)
{
	struct sembuf sops = { 0,-1,0 }; //参数1 第几个sem  参数三 标志 0为默认 阻塞
	semop(sem_id, &sops, 1); //1 操作1个信号量
}

void sem_v(int sem_id)
{
	struct sembuf sops = { 0,1,0 };
	semop(sem_id, &sops, 1);
}
int semid1 = semget(1234, 1, 0); //参数1 key 参数2 初始化的信号量个数 参数三 信号量的创建方式或权限
if (semid1 == -1)//如果打开失败 就创建
{
	semid1 = semget(1234, 1, IPC_CREAT | 0666);
}

二、上课没有听懂或者没有理解的地方

三、当天学习的收获

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值