【Linux】IPC知识点总结

匿名管道

  • 具有亲缘关系的进程之间进行通信
  • 半双工通信,只能提供字节流服务
  • 当传输的数据小于PIPE_BUF时,带有同步与互斥属性
  • 生命周期随进程
  • 如果管道中没有数据,产生读阻塞
  • 如果管道中写满了数据,产生写阻塞
  • 如果读端被关闭,写端还往管道中写数据时,会造成管道破裂,当前正在写的进程收到SIGPIPE信号,导致进程终止
  • 如果写端被关闭,读端读完管道的数据后,read不会处于阻塞状态,而是返回读到的字节数0
  • 管道的大小为PIPE_SIZE:64K
  • 如果一次写入的数据大小大于PIPE_BUF(4k)时,不能保证写入数据的操作为原子性操作
  • 原子性操作:当前操作不会被打断,只有做完和没做两种情况
  • 临界资源:同一时间内,当前的资源只能被一个进程访问
  • 互斥:同一时间内,只能有一个进程访问临界资源
  • 同步:保证临界资源访问的时序合理性

命名管道

  • 命名管道是具有标识符的管道
  • 属性与匿名管道相同
  • 创建方式
    命令: mkfifo [命名管道文件名称]
    函数: mkfifio(char* pathname ,mode_t mode)
  • 使用与普通文件相同,打开文件完成读写操作

共享内存(shm)

  • 原理
    1.首先在物理内存中开辟一块内存
    2.需要通信的进程通过页表结构将这块内存地址映射到自己的虚拟地址空间中的共享区
    3.各个进程通过修改自己虚拟地址空间上的地址完成相互的通信
  • 接口函数
    1.创建
    int shmget(key_t key,size_t size,int shmflg)
    (shmflg:IPC_CREAT,IPC_CREAT | IPC_EXCL,此条命令成功则返回共享内存的操作句柄shmid)
    2.给共享内存附加进程
    void* shmat(int shmid,const void* shmaddr,int shmflg)
    (shmflg:0 可读可写,IPC_RDONLY:只读)
    3.共享内存分离进程
    int shmdt(const void * shmaddr)
    4.销毁共享内存
    int shmctl(int shmid,int cmd,struct shmid_ds* buf)
    (cmd:IPC_STAT命令需要搭配shmid_ds结构体来获取共享内存的信息)
    (IPC_RMID删除共享内存)
  • 共享内存特性
    1.共享内存不带有同步与互斥的功能
    2.写入数据的方式按照覆盖的方式进行
    3.生命周期跟随操作系统内核
//查看共享内存
ipcs -m

//删除共享内存
ipcrm -m [shmid]

消息队列

队列的属性是先进先出,底层的实现为链表,在内核中创建,使用共享队列标识符来表示,且该队列中每个元素都有自己的类型
消息队列在操作系统中的属性

//每个节点的最大消息发送字节数
cat /proc/sys/kernel/msgmsx  8192

//队列中所有消息的长度之和
cat /proc/sys/kernel/msgmnd 16384

//系统中的最大队列数
cat /proc/sys/kernel/msgmnd 2379

1.构造消息队列
int msgget(key_t key,const void * msgq,size_t size ,int msgflg)
/*(msgflg:
IPC_CREAT
IPC_CREAT | IPC_EXCL增加消息队列的使用权限)*/

2.发送
int msgsnd(int msqid,const void* msgq,size_t size,int msgflg)
/*(msgflg:
0,队列满时会阻塞;
IPC_NOWAIT:如果队列满了。当前的发送操作不会阻塞,函数返回)*/

3.接受
int msgrcv(int msqid,void* msgq,size_t msgsz,long msgtype,int msgflg)
/*(msgtype:
0,接收任意类型;
msgtype> 0:返回消息队列中消息类型为msgtype的第一个消息
msgtype< 0:返回消息队列中消息类型优先级≤msgtype的消息,如果消息特别多,返回类型优先级最小的消息*/

4.销毁
int msgctl(int msgid,int cmd,struct msgid_ds* buf)
cmd:
IPC_STAT
IPC_SET
IPC_RMID

特点

  • 生命周期随内核,如果不使用命令删除,消息队列会一直存在
  • 消息队列可以双向通信(双工通信)
  • 克服了管道无格式的字节流的缺点

信号量

信号量的作用是实现进程控制,就是实现进程的同步与互斥
**本质:**信号量的本质是一个计数器+PCB等待队列,计数器是对资源进行计数,进行+1或-1操作。
信号量的互斥操作
在初始化信号量中计数器的值时,我们将其初始化为1,表示只有一个资源可用,只有一个进程可以访问临界起源
信号量的同步操作
当有多个资源时,为了保证对临界资源访问的合理性,信号量的计数器取值为资源的数量+PCB等待队列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值