【Linux】linux进程--进程间通信第二部分:命名空间、共享内存

目录

1.命名管道

1.1.创建命名管道

1.1.1.mkfifo命令:

1.1.2.int  mkfifo(const  char  *pathname , mode_t  mode);

1.2.命名管道的特性

2.共享内存:share memory(shm)

2.1.共享内存的原理

2.2.共享内存的接口

2.2.1.创建或者获取共享内存接口

2.2.2.将共享内存附加到进程的虚拟地址空间

2.2.3.分离共享内存接口

2.2.4.操作共享内存接口

2.3.共享内存的特性

3.消息队列

3.1.消息队列的原理

3.2.消息队列的接口

3.2.1.创建消息队列

3.2.2.发送消息

3.2.3.接收消息

3.2.4.操作消息队列

​编辑3.3.消息队列的特性


1.命名管道

1.1.创建命名管道

1.1.1.mkfifo命令:

 结论:

     数据还是存储在内核的缓冲区当中;

     管道文件的作用是为了让不同的进程可以找到这块缓冲区

1.1.2.int  mkfifo(const  char  *pathname , mode_t  mode);

参数:

     pathname:待要创建的命名管道文件(带路径)

     mode_t:指定管道文件的权限(八进制数字)

返回值:

     成功返回0;失败返回-1。

1.2.命名管道的特性

1)支持不同的进程进行进程间通信,不再依赖亲缘性了;

2)因为不同的进程可以通过命名管道文件找到命名管道(操作系统内核的缓冲区)。


2.共享内存:share memory(shm)

2.1.共享内存的原理

1)在物理内存当中开辟一段空间

2)不同进程通过页表将物理内存空间映射到自己的虚拟进程地址空间当中

3)不同的进程通过操作自己进程虚拟地址空间当中的虚拟地址来操作共享内存

2.2.共享内存的接口

2.2.1.创建或者获取共享内存接口

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

参数:

     key:共享内存标识符(共享内存的名字)

     size:共享内存的大小

     shmflg:获取/创建共享内存时,传递的属性信息

          IPC_CREAT:如果获取的共享内存不存在,则创建

          IPC_EXCL | IPC_CREAT:如果获取的共享内存存在则报错;不存在则创建

返回值:

     成功返回共享内存操作句柄;失败返回-1。

2.2.2.将共享内存附加到进程的虚拟地址空间

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

参数:

     shmid:共享内存操作句柄

     shmadder:将共享内存附加到共享区当中的一个地址上(一般传递NULL)

     shmflg:以什么权限将共享内存附加到进程当中

          SHM_RONLY:只读

          O:可读可写

返回值:

     成功返回附加的虚拟地址(ahmadder);失败返回NULL。

2.2.3.分离共享内存接口

int  shmdt(const  void  *shmaddr);

参数:

     shmaddr:shmat的返回值

返回值:

     成功返回0;失败返回-1.

2.2.4.操作共享内存接口

int  shmctl(int  shmid , int  cmd , struct  shmid_ds  *buf);

参数:

     chmid:共享内存操作句柄

     cmd:告诉shmctl函数需要完成什么功能

          IPC_SET:设置共享内存属性信息,buf是入参内容由使用者组织

          IPC_STAT:获取共享内存的属性信息,buf是出参内容由函数填充

          IPC_RMID:删除共享内存,buf参数传NULL

     buf:共享内存数据结构buf

2.3.共享内存的特性

1)生命周期跟随操作系统

2)共享内存是覆盖写的方式,读的时候是访问地址(数据不会被读走)

3)共享内存的删除特性:ipcrm  -m  [shmid](删除共享内存的命令)

     一旦共享内存被删除掉之后,共享内存在物理内存当中的空间就销毁了

     如果删除共享内存的时候共享内存附加的进程数量为0,则内核当中描述该共享内存的结构体也被释放了

     如果删除的共享内存的时候,共享内存附加的进程数不为0,则会将该共享内存的key变成0x00000000。表示当前共享内存不能被其他进程所附加,共享内存的状态会被设置成为destory,附加的进程一旦全部退出,该共享内存在内核当中的结构体就会被OS释放掉。


3.消息队列

3.1.消息队列的原理

队列的特性是先进先出,只要是满足先进先出特性的数据结构都可以称之为队列

消息队列:就是操作系统内核用链表实现的队列

1)msgqueue采用链表来实现消息队列,该链表是由系统内核维护。

2)系统中可能有很多的msgqueue,每个MQ用消息队列描述符(消息队列ID:qid)来区分,qid是唯一的,用来区分不同的MQ。

3)在进行进程间通信时,一个进程将消息加到MQ尾端,另一个进程从消息队列中取信息(不一定以先进先出提取消息,也可以按照消息类型提取消息),这样就实现了进程间的通信。

消息队列的每一个元素都是由类型的,用类型可以区分不同的消息

按照消息类型先进先出;也可以按照原本的顺序先进先出

3.2.消息队列的接口

3.2.1.创建消息队列

int  msgget(key_t  key , int  msgflg);

参数:

     key:消息队列的标识符

     msgflg:创建的标志,例如IPC_CREAT

返回值:

     成功返回队列ID;失败返回-1,并且设置error。

3.2.2.发送消息

int  msgsnd(int  msqid , const  void  *msgp , size_t  msgsz , int  msgflg);

参数:

     msgid:消息队列ID

     msgp:指向msgbuf的指针,用来指向发送的信息

     msgsz:要发送消息的长度

     msgflg:创建标记,如果指定IPC_NOWAIT,失败会立刻返回

返回值:

     成功返回0;失败返回-1,并且设置error。

3.2.3.接收消息

ssize_t  msgrcv(int  msqid , void  *msgp , size_t  msgsz , long  msgtyp , int  msgflg);

参数:

     msqid:消息队列ID

     msgp:指向msgbuf的指针,用来接收消息

     msgsz:要接受的消息长度

     msgtyp:接受消息的方式

msgtyp=0:读取队列中的第一条消息,相当于没有区分类型,按照插入的顺序先进先出;

msgtyp>0:读取队列中类型为msgtyp的第一条消息;

msgtyp<0:读取队列当中最小类型小于或等于msgtyp绝对值的第一条消息

     msgflg:创建标记,如果指定IPC_NOWAIT,获取失败会立刻返回

返回值:

     成功返回实际读取消息的字节数;失败返回-1,并且设置error。

3.2.4.操作消息队列

int  msgctl(int  msqid , int  cmd , struct  msqid_ds  *buf);

参数:

     msqid:消息队列ID

     cmd:控制命令

          IPC_RMID:删除命令

          IPC_STAT:获取状态

     buf:存储消息队列的相关信息的buf

返回值:

     成功根据不同的cmd有不同的返回值;失败返回-1;并且设置error。

3.3.消息队列的特性

1)生命周期跟随操作执行内核

2)ipcrm  -q  [qid]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值