标题:
IPC-管道, 消息队列, 信号量
[打印本页]
作者:
苹果也疯狂
时间:
2015-7-20 11:02
标题:
IPC-管道, 消息队列, 信号量
Linux下使用ipcs -a来查询当前系统的IPC对象信息
[
www.linuxidc.com
@localhost ~]$ ipcs -a
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 65536 crazybaby 600 393216 2 dest
0x00000000 98305 crazybaby 600 393216 2 dest
0x00000000 131074 crazybaby 600 393216 2 dest
0x00000000 163843 crazybaby 600 393216 2 dest
0x00000000 196612 crazybaby 600 393216 2 dest
0x00000000 229381 crazybaby 600 393216 2 dest
0x00000000 262150 crazybaby 600 393216 2 dest
0x00000000 294919 crazybaby 600 393216 2 dest
0x00000000 327688 crazybaby 600 393216 2 dest
0x00000000 360457 crazybaby 600 393216 2 dest
0x00000000 393226 crazybaby 600 393216 2 dest
------ Semaphore Arrays --------
key semid owner perms nsems
------ Message Queues --------
key msqid owner perms used-bytes messages
从上到下分别为 共享内存, 信号量, 消息队列.我这里 信号量和消息队列都是空的.
shmid
为 IPC对象标识符 ,不同类型的IPC对象标识符可以相同,但在同类型中IPC中唯一的.
key
为IPC对象关键字, 这个关键字你可以理解为文件的名称,而标识符理解为文件的i节点,在IPC中可以通过key找到对应的标识符,再通过标识符访问IPC对象
管道
管道是一个先进先出的队列,一个进程写,一个进程读,管道也可以理解为共享文件,,向管道的输入写进程,以字符流形式将大量数据送入管道,而接受管道输出的接受进程,则从管道中读取数据.
操作linux的童鞋,经常有这样的操作.
Ps –ef | grep XXXX
这个就是一个进程间通信(管道)的例子, 首先ps –ef 取出当前运行的所有进程,进程 grep XXXX 从所有进程中筛选出 XXXX 的进程,看下图:
管道分为
命名管道(FIFO)和匿名管道
,只有父子关系的进程才可以共享匿名管道,不相关的进程只能共享命名管道.,也可以这么去理解 在目录文件中记载了文件和i节点对应关系是命名管道,没有的是无名管道.
Linux c下提供一些创建管道的函数.
无名管道:
int
pipe(
int
fields[2]);
有名管道创建需要使用mknode和 mkfifo 进行创建
消息队列
消息是一个有类型的文本,参与消息传递的进程提供snd 和 rcv 系统调用, 消息发送者指定发送的消息类型,类型在后面会被接收者作为选择的依据.所以,接收者可以按先进先出的顺序接受信息,还可以按类型来接受,当进程准备给一个满队列发送消息时,它会被阻塞,当进程试图从一个空队列读取时也会被阻塞, 另外多个进程可以同时向一个消息队列发送消息,也可以向同一个消息队列接受消息.消息队列主要是用于
不同进程
之间
少量
数据的
顺序
共享.
信号量
OS提供两个操作P和V, 进程申请临界资源时发出P操作,进程释放临界资源时发出V操作,
申请: 若信号量取值 > 0,则分配临界资源,,信号量值 – 1,否则进程阻塞直到有资源.
释放: 信号量的值 + 1
信号量作用:
用于临界资源的读写控制和并发进程的同步和互斥控制
上面这张图就表明了Semaphore 的同步两个进程的作用.
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0