【发布时间】:2011-06-14 06:22:29
【问题描述】:
在我看来signal 和socket 都可以用于这项工作,
你如何决定实际使用哪一个?
【问题讨论】:
-
您能否详细说明两个进程之间将传递的信息?进程间通信方式有很多种。
-
将信号用于 IPC 就像为邮件选择 pidgeons。还有更方便的选择。
-
尽可能避免信号;他们非常原始,能做的事情也很有限。
在我看来signal 和socket 都可以用于这项工作,
你如何决定实际使用哪一个?
【问题讨论】:
为 IPC 使用信号有点不方便和原始。您真的应该在 Unix 套接字(不是 TCP 套接字!)和管道之间进行选择。
管道通常更容易编程,因为它们保证PIPE_BUF 大小下的单个write 是原子的。然而,它们确实有其局限性。例如,当写入器比读取器快时,写入器会在管道缓冲区满时开始阻塞。默认情况下,这个缓冲区的大小约为 64k,并且在不重新编译内核的情况下无法更改,至少在 Linux 中是这样。管道也是单向的,这意味着您必须在每个进程中保留一对管道,一个用于读取,一个用于写入。
Unix 套接字具有可配置的发送缓冲区大小和更高级的编程接口。
【讨论】:
read可以组合多个write调用。 (请参阅:pastebin.com/LxbreJke)此外,通常不应该对缓冲区大小做出假设(64k 缓冲区是最近发生的变化:我经常使用较旧的 Linux boxen,因为人们拒绝更新。)。管道和套接字之间的主要区别是 FIFO 管道是单向的,Unix 套接字是双向的。