进程通信

  1. 管道

    管道是通过pipe函数创建, fd[0]用于读, fd[1]用于写.

    1
    2
    #include <unistd.h>
    int pipe(int fd[2]);

    具有以下限制:

    1. 只支持半双工通信(单向交替传输)
    2. 只能在父子进程中使用
  2. FIFO

    也被称为命名管道, 可以不止在父子进程中使用.

    1
    2
    3
    #include <sys/stat.h>
    int mkfifo(const char* path, mode_t mode);
    int mkfifioat(int fd, const char* path, mode_t mode);

    FIFO常用于C/S模型, FIFO作为汇聚点, 在C/S进程时间传递消息.

  3. 消息队列

    相比较FIFO, 消息队列有以下优点:

    1. 消息队列可以独立于读写进程存在, 从而避免了FIFO中同步管道的打开和关闭时可能产生的困难.
    2. 避免了FIFO的同步阻塞, 不需要进程提供同步方法.
    3. 读进程可以根据消息类型有选择的接收消息, 而不像FIFO那样只能默认的接收.
  4. 信号量

    他是一个计数器, 用于为多个进程提供共享数据对象的访问.

  5. 共享存储

    允许多个进程共享一个给定的存储区, 因为数据不需要在进程之间复制, 所以这是一种最快的IPC.

    需要使用信号量来互斥的对共享存储进行访问.

    多个进程可以将同一个文件映射到他们的地址空间从而实现共享内存. 另外XSI共享内存不是使用文件, 而是使用内存的匿名段.

  6. 套接字

    和其他通信机制不同的是, 他可用于不同机器间的进程通信.