进程间通信就是在不同进程间传播或交换信息。进程的用户空间是相互独立的,一般而言是不能互相访问的,唯一的例外是共享的内存区。
Linux下进程间通信的几种主要方式:
1.管道(pipe)和有名管道(FIFO)
管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,他还允许无亲缘关系进程间的通信。
2.信号
信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持unix早起信号语义函数sigal外,还支持予以符合posix.1标准的信号函数sigaction。
信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。
3.消息队列
消息队列是消息的链接表。有足够的权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息少,管道只能承载无格式字节流,以及缓冲区大小受限等缺点。
4.共享内存
可以说是最有用的进程间通信方式,也是最快的ipc形式。两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A。B各自的进程地址空间。进程A可以即时看到进程B对共享内存中的数据更新,反之亦然。
5.信号量
主要作为进程间,以及同一进程不同线程之间的同步手段。信号量是用来解决进程之间的同步与互斥问题的一种进程之间通信机制,包括一个成为信号量的变量和在该信号量下等待资源的进程等待队列,以及对信号量进行的两个原子操作。其中信号量对应于莫一种资源,取一个非负 的整型值。信号量的指是指当前可用的资源数量,若它等于0则意味着目前没有可用的资源。
6.套接字
套接字:更为一般的通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其他类unix系统上,Linux和System V的变种都支持套接字