进程与线程(7)

IPC通信方式:

一、共享内存

system v : 共享内存

  1. 是一块,内核预留的空间
  2. 最高效的通信方式 (避免了用户空间 到 内核空间的数据拷贝)

二、IPC对象操作通用框架:

key值 ==> 申请 ==》读写 ==》关闭 ==》卸载

1.ftok函数

产生key值

key_t ftok(const char *pathname, int proj_id);

(1)功能:将pathname 和 proj_id 转换为 key值

(2)参数:pathname:给一个路径名 ;proj_id:工程id eg: 'A'

(3)返回值:成功: key值;失败: -1

cs 复制代码
key_t key = ftok("/",'A');

	if (key < 0)
	{
		perror("ftok fail");
		return -1;
	}

	printf("key = %d\n",key);
2.shmget函数

通过key获取ipc对象 (共享内存)

int shmget(key_t key, size_t size, int shmflg);

(1)功能:使用唯一键值key向内核提出共享内存使用申请

(2)参数:key:唯一键值;size: 要申请的共享内存大小;shmflg: 申请的共享内存访问权限,八进制表示(如果是第一个申请,则用IPC_CREAT;如果要检测是否存在,用IPC_EXCL)

(3)返回值:成功: 返回共享内存id,一般用shmid表示;失败 : -1;

cs 复制代码
int shmid = shmget(key,1024,IPC_CREAT|0666);

	if (shmid < 0)
	{
		perror("shmget fail");
		return -1;
	}

	printf("shmid = %d\n",shmid);
3.shmat函数

共享内存 绑定

void *shmat(int shmid, const void *shmaddr, int shmflg);

(1)功能:将指定shmid对应的共享内存映射到本地内存。

(2)参数:shmid:要映射的本地内存;shmaddr:本地可用的地址,如果不确定则用NULL,表示由系统自动分配;shmflg:(0 :表示读写;SHM_RDONLY:只读)

(3)返回值:成功: 返回映射的地址,一般等于shmaddr;失败: (void*)-1

cs 复制代码
void *p = shmat(shmid,NULL,0);
    if(p == (void *)-1)
    {
        perror("shmid fail");
        return -1;
    }
    signal(SIGUSR1,handler);
    pid_t *q = (pid_t *)p;
    *q = getpid();
    char *s = (char *)p;
    while(1)
    {
        printf("s = %s\n",s);
        if(strncmp(s,"quit",4) == 0)
        {
            break;
        }
        paus
4.shmdt函数:

解除绑定(映射)

int shmdt(const void *shmaddr);

(1)功能:将本地内存与共享内存断开映射关系。

(2)参数:shmaddr 要断开的映射地址。

(3)返回值:成功: 0;失败: -1;

cs 复制代码
if(shmdt(p) < 0)
    {
        perror("shmdt fail");
        return -1;
    }
5.shmctl函数

销毁IPC对象

int shmctl(int shmid, int cmd, struct shmid_ds *buf); //ctl = control

(1)功能:修改共享内存属性,也可以删除指定的共享内存对象。

(2)参数:shmid: 要删除的共享内存对象;cmd: IPC_RMID 删除对象的宏;buff: NULL 表示只删除对象。

(3)返回值:成功: 0; 失败: -1

cs 复制代码
 if(shmctl(shmid,IPC_RMID,NULL) < 0)
    {
        perror("shmctl fail");
        return -1;
    }

练习:

二、消息队列

消息队列是一旦创建,则会一直存在。除非关机,或者自己在程序中做删除,或者通过命令的方式(ipcrm)显式的来删除!消息队列可以实现对不同类型的消息的收发,那么这些类型的消息是放在同一个消息队列中的!接收方可以学着接受哪种类型的消息!

三、信号量集

信号灯的出现主要是为了解决多任务程序并发执行时,对资源的访问出现的竞争同步的问题。信号量最初是对资源的一种抽象和模拟,最初的信号量(整型信号量),就是通过一个数值,来表示某种资源的个数,在你这个抽象的基础上,他的发明者Dijkstra(迪杰斯塔拉)为其制定了两个原子性(一次性执行完的,不可被中断的)的操作,P操作(passeren(申请通过)),V操作(vrijgeven释放)来实现对互斥资源的访问,后来处于对(1).多个临界资源的访问,(2)和资源使用数量的限制(在有些情况下,当资源数量低于某一下限值时,便不予分配).信号量的概念得到进一步发展,形成了所谓的"信号灯集".

相关推荐
passer__jw76720 分钟前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
Ocean☾26 分钟前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序34 分钟前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
TeYiToKu1 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
dsywws1 小时前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习
爱吃生蚝的于勒1 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
yeyuningzi1 小时前
Debian 12环境里部署nginx步骤记录
linux·运维·服务器
羊小猪~~1 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
上辈子杀猪这辈子学IT1 小时前
【Zookeeper集群搭建】安装zookeeper、zookeeper集群配置、zookeeper启动与关闭、zookeeper的shell命令操作
linux·hadoop·zookeeper·centos·debian
minihuabei1 小时前
linux centos 安装redis
linux·redis·centos