Linux进程间通信方式--信号,管道,消息队列,信号量,共享内存

1、概述

通信方法 无法介于内核态与用户态的原因
管道(不包括命名管道) 局限于父子进程间的通信。
消息队列 在硬、软中断中无法无阻塞地接收数据。
信号量 无法介于内核态和用户态使用。
内存共享 需要信号量辅助,而信号量又无法使用。
套接字 在硬、软中断中无法无阻塞地接收数据。

2、信号

信号又称软终端,通知程序发生异步事件,程序执行中随时被各种信号中断,进程可以忽略该信号,也可以中断当前程序转而去处理信号。信号携带的数据比较有限。引起信号原因:

1).程序中执行错误码;

2).其他进程发送来的;

3).用户通过控制终端发送来;

4).子进程结束时向父进程发送SIGCLD;

5).定时器生产的SIGALRM;

3、管道

单向,一段输入,另一端输出,先进先出FIFO。管道也是文件。管道大小4096字节。

特点:管道满时,写阻塞;空时,读阻塞。

分类:普通管道(通信进程间必要要有相同的父进程)位于内存;命名管道位于文件系统,没有亲缘关系管道只要知道管道名也可以通讯。

管道是由内核管理的一个缓冲区(buffer),相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管道可以被循环利用。当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失。

https://i-blog.csdnimg.cn/blog_migrate/5488428d15a8cb6457937d703fa67d7c.jpeg

4、消息队列

消息队列是先进先出FIFO原则

消息结构模板

strut msgbuf
{
long int  mtype;//消息类型
char mtext[1];//消息内容

}

       不同于管道,通信的两个进程可以是完全无关的进程,不需要同步,而管道要求,不论是匿名管道还是有名管道,通信的两个进程都必须是正在运行的进程。而且从消息队列中选取消息时,并不一定要按照先进先出的顺序。

5、共享内存

共享内存是分配一块能被其他进程访问的内存,实现是通过将内存去映射到共享它的进程的地址空间,使这些进程间的数据传送不再涉及内核,即,进程间通信不需要通过进入内核的系统调用来实现;对共享内存段的访问有时需要使用信号量进行同步。

共享内存与其他的进程间通信最大的优点是:数据的复制只有两次,一次是从输入文件到共享内存区,一次从共享内存区到输出文件

而其他的则是需要复制4次:服务器将输入文件读入自己的进程空间,再从自己的进程空间写入管道/消息队列等;客户进程从管道/消息队列中读出数据到自己的进程空间,最后输出到客户指定的文件中;

要使用共享内存,应该有如下步骤:
1.开辟一块共享内存     shmget()
2.允许本进程使用共某块共享内存  shmat()
3.写入/读出
4.禁止本进程使用这块共享内存   shmdt()
5.删除这块共享内存     shmctl()或者命令行下ipcrm


6、信号量

信号量是一种用于提供不同进程间或一个进程间的不同线程间线程同步手段的原语,systemV信号量在内核中维护

二值信号量 : 其值只有0、1 两种选择,0表示资源被锁,1表示资源可用;
计数信号量:其值在0 和某个限定值之间,不限定资源数只在0 1 之间;

计数信号量集 ;多个信号量的集合组成信号量集

转 http://blog.csdn.net/21aspnet/article/details/7479469

http://www.cnblogs.com/vamei/archive/2012/10/10/2715398.html  待处理


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值