说说我熟悉一点的 Linux
通信就是说进程之间传递数据。常见的方法有 pipe(管道),FIFO(命名管道),socket(套接字),SysVIPC 的 shm(共享内存)、msg queue(消息队列),mmap(文件映射)。以前还有 STREAM,不过现在比较少见了(好像)。
同步的意思是说,让不同进程能够在同时到达一个已知的特定状态之前等待另一方的执行。Linux 下常见的同步方法有SysVIPC 的 sem(信号量)、file locking / record locking(通过 fcntl 设定的文件锁、记录锁)、futex(基于共享内存的快速用户态互斥锁)。针对线程(pthread)的还有 pthread_mutex 和 pthread_cond(条件变量)。
除了这些特定的同步对象之外,还有一些同步方法是与通信方法不可分离的,包括:对 pipe/FIFO/socket 和 msg queue 的阻塞等待、对子进程退出事件的等待(wait族)、对线程退出时间的等待(pthread_join)
另外还有一个不能不提的,就是信号。Unix 信号是异步处理的、可以终端接收进程执行过程的特殊 IPC 方式——其实既可以算同步也可以选通讯了。
Linux 下的 IPC,不说别的,就一个字儿——乱! -_-#
可以终端接收进程执行过程的特殊 IPC 方式
改为 可以中断(打断)接收方当前执行过程的……
Win32 下面,我知道的通信方式有几个:
socket 是有的,然后是 Pipe 管道和命名管道(比 Unix 的管道强悍的多,口水一个),FileMapping 是有的,共享内存没有太大印象,另外还有一个所谓的 mail slot,看到过,没见过人用…… COM 不知道是怎么传递对象的?
同步对象有 Mutex 和 EventObject,Semaphore 信号量应该也有只是记不得。另外很重要的一个就是 Windows Message,应该是高阶的、经过封装的同步方式,但是非常好用。IOCP、异步 socket 和窗口信息都是 Windows Message 传递的。 |