许多IPC由Unix / Linux提供:管道,套接字,共享内存,dbus,消息队列…
每个最合适的应用程序是什么,它们如何执行?
Unix IPC
这里是大七:
> Pipe
仅在与父/子相关的进程中有用。呼叫pipe(2)
和fork(2)
.单向。
> FIFO,或命名管道
两个不相关的进程可以使用FIFO不同于普通管道。呼叫mkfifo(3)
.单向。
> Socket和Unix Domain Socket
双向。适合网络通信,但也可以在本地使用。可用于不同协议。 TCP没有消息边界。致电socket(2)
。
> Message Queue
信号发送一个整数到另一个进程。不能很好地与多线程网格。致电kill(2)
。
> Semaphore
用于多进程或线程的同步机制,类似于人等待浴室的队列。见sys/sem.h。
> 70014
做你自己的并发控制。致电shmget(2)
。
消息边界问题
在选择一种方法时,一个决定因素是消息边界问题。你可能期望“消息”彼此是离散的,但它不是像TCP或Pipe的字节流。
考虑一对echo客户端和服务器。客户端发送字符串,服务器接收它并立即发送它。假设客户端发送“Hello”,“Hello”和“如何回答?”。
使用字节流协议,服务器可以接收作为“地狱”,“oHelloHow”和“关于答案?或更现实地“HelloHelloHow关于答案?”。服务器没有消息边界的线索。
一个老年人的技巧是将消息长度限制为CHAR_MAX或UINT_MAX,并同意在char或uint中首先发送消息长度。所以,如果你在接收方,你必须先阅读消息长度。这也意味着只有一个线程应该一次执行消息读取。
使用像UDP或消息队列的离散协议,你不必担心这个问题,但是编程方式的字节流更容易处理,因为它们像文件和stdin / out。