首先,进程间通信至少可以通过传送打开文件来实现,不同的进程通过一个或多个文件来传递信息,事实上,在很多应用系统里,都使用了这种方法。但一般说来, 进程间通信(IPC:InterProcess Communication)不包括这种似乎比较低级的通信方法。Unix系统中实现进程间通信的方法很多,而且不幸的是,极少方法能在所有的Unix系统中进行移植(唯一一种是半双工的管道,这也是最原始的一种通信方式)。而Linux作为一种新兴的操作系统,几乎支持所有的Unix下常用的进程间通信方法:管道、信号、消息队列、共享内存、信号量、套接口等等。
管道:
写端固定:2、读端不存在:系统默认发送信号SIGPIPE结束当前进程。进程结束管道将不存在。
单独运行读端或者写端都会阻塞,先运行哪个进程就在哪个进程中创建管道。
对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。
消息队列:
消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。
消息的发送者和接收者不需要同时与消息队列互交。消息会保存在队列中,直到接收者取回它。
消息队列允许接收者在消息发送很长时间后再取回消息,但消息队列的这个特点,也造成了一个缺点,就是接收者必须轮询消息队列,才能收到最近的消息。
消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。但消息队列仍然有大小限制。
小结:消息队列与管道以及有名管道相比,具有更大的灵活性,首先,它提供有格式(char)字节流,有利于减少开发人员的工作量;其次,消息具有类型,在实际应用中,可作为优先级使用。这两点是管道以及有名管道所不能比的。同样,消息队列可以在几个进程间复用,而不管这几个进程是否具有亲缘关系,这一点与有名管道很相似;但消息队列是随内核持续的,与有名管道(随进程持续)相比,生命力更强,应用空间更大。
管道一般用于数据传输,信号用于事件通知,信号灯用于资源共享