一。管道(pipe) 管道是Linux支持的最初IPC方式,管道可分为无名管道,有名管道等。 (一)无名管道,它具备几个特色: 1) 管道是半双工的,只能支持数据的单向流动;两进程间须要通讯时须要创建起两个管道; 2) 无名管道使用pipe()函数建立,只能用于父子进程或者兄弟进程之间; 3) 管道对于通讯的两端进程而言,实质上是一种独立的文件,只存在于内存中; 4) 数据的读写操做:一个进程向管道中写数据,所写的数据添加在管道缓冲区的尾部;另外一个进程在管道中缓冲区的头部读数据。 (二)有名管道 有名管道也是半双工的,不过它容许没有亲缘关系的进程间进行通讯。具体点说就是,有名管道提供了一个路径名与之进行关联,以FIFO(先进先出)的形式存在于文件系统中。这样即便是不相干的进程也能够经过FIFO相互通讯,只要他们能访问已经提供的路径。 值得注意的是,只有在管道有读端时,往管道中写数据才有意义。不然,向管道写数据的进程会接收到内核发出来的SIGPIPE信号;应用程序能够自定义该信号处理函数,或者直接忽略该信号。 二。信号量(semophore) 信号量是一种计数器,能够控制进程间多个线程或者多个进程对资源的同步访问,它常实现为一种锁机制。实质上,信号量是一个被保护的变量,而且只能经过初始化和两个标准的原子操做(P/V)来访问。(P,V操做也常称为wait(s),signal(s)) 三。信号(Signal) 信号是Unix系统中使用的最古老的进程间通讯的方法之一。操做系统经过信号来通知某一进程发生了某一种预约好的事件;接收到信号的进程能够选择不一样的方式处理该信号,一是能够采用默认处理机制—进程中断或退出,一是忽略该信号,还有就是自定义该信号的处理函数,执行相应的动做。 内核为进程生产信号,来响应不一样的事件,这些事件就是信号源。信号源能够是:异常,其余进程,终端的中断(Ctrl-C,Ctrl+\等),做业的控制(前台,后台进程的管理等),分配额问题(cpu超时或文件过大等),内核通知(例如I/O就绪等),报警(计时器)。 四。消息队列(Message Queue) 消息队列就是消息的一个链表,它容许一个或者多个进程向它写消息,一个或多个进程向它读消息。Linux维护了一个消息队列向量表:msgque,来表示系统中全部的消息队列。 消息队列克服了信号传递信息少,管道只能支持无格式字节流和缓冲区受限的缺点。 五。共享内存(shared memory) 共享内存映射为一段能够被其余进程访问的内存。该共享内存由一个进程所建立,而后其余进程能够挂载到该共享内存中。共享内存是最快的IPC机制,但因为linux自己不能实现对其同步控制,须要用户程序进行并发访问控制,所以它通常结合了其余通讯机制实现了进程间的通讯,例如信号量。 socket也是一种进程间的通讯机制,不过它与其余通讯方式主要的区别是:它能够实现不一样主机间的进程通讯。