C语言之进程间通信IPC学习

linux下进程间通信方法:管道,消息队列,信号量,共享存储和套接字(其他:FIFO, 文件,信号)

1 半双工管道

使用pipe(fd)实现,用户父进程fork的子进程中。 通过read fd[0]  write fd[1]实现。使用pipe实现的方法有:

1)标准库提供popenpclose

2)协同进程,比如awk

无名管道简单方便.但局限于单向通信的工作方式.并且只能在创建它的进程及其子孙进程之间实现管道的共享:有名管道虽然可以提供给任意关系的进程使用.但是由于其长期存在于系统之中,使用不当容易出错。

2 消息队列

msgrcv/msgsndlinux系统中异步或进程间通信的一种机制,这两个函数主要用于操作特定的消息队列。msgrcv()可以从消息队列中读取消息,msgsnd()将一个新的消息写入队列。

通过 key = ftok("msg.tmp", 0x01 ) ;获取key值,然后通过msgrcv/msgsnd进行消息交互

消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点,但是信息的复制需要额外消耗CPU的时间.不适宜于信息量大或操作频繁的场合

3 信号量

semctl

信号量是一个计数器,可以用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源.因此,主要作为进程间以及同一个进程内不同线程之间的同步手段.

4 共享内存

shmdt

共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,无须复制,快捷、信息量大是其优点。但存在写操作的同步问题;不方便网络通信。

5 套接字

套接口也是一种进程间通信机制,

 

一般来说,进程间的通信根据通信内容可以划分为两种:控制信息的传送与大批数据传送。

有时也把进程间控制信息的交换称为低级通信;而把进程间大批量数据的交换称为高级通信。

方法

特点

信号

传递信息少,触发某些行为(如中断)

无名管道

单向通信;进程与子进程通信

有名管道

提供给任意关系的进程使用.因为长期存在于系统之中,容易出错.普通用户不建议使用

消息队列

克服信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点;但消耗CPU不适宜信息量大或操作频繁的场合

共享内存

无须复制,快捷、信息量大;但是同步和网络通信需要考虑

 



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值