一、学习的知识点
- 线程属于POSIX线程
- 互斥锁、信号量属于POSIX信号量 在进程内部使用
- systemV信号量: semget shmget 在进程间使用
- 通过ipcs查看的都是systemV系列
- 信号量都是对一个数字进行加一减一的操作,信号量为 0 时,若进行减一,则阻塞在此,
- 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);
}
二、上课没有听懂或者没有理解的地方
无