进程间通信

  1. 信号

    • 由于某些错误而产生的事件
    • 可以设定信号触发之后的处理方式,但信号是系统已经确定的
      1
      2
      void (*signals(int signum, void(*hangdler)(int)))(int);
      int sigaction(int signum, const struct sigaction * act, struct sigaction * addr)
  2. 管道和命名管道
    实质是先进先出,半双工的数据结构,双方通信需要两个管道

    • 管道:只能用于相互关联的进程间通信,如:父子进程
    • 命名管道: = 特殊文件
      1
      2
      mkfifo(const char * pathname, mode_t mode); //建立管道文件
      read() write() close() 均可操作
  3. 信号量
    主要用于控制多个线程对临界区资源的访问

  4. 消息队列
    将消息按队列方式组成的链表

    1
    2
    3
    4
    int msgget(key_t key, int msgflg);
    int msgsnd(int msgid, const void * msgptr, int msgsz, int msgflg);
    int msgrcv(int msgid, const void * msgptr, int msgsz, long msgtyp, int msgflg);
    int msgctl(int msgid, int cmd, struct msgid_ds *buf);
  5. 共享内存
    直接操作内存,不用复制文件 系统创建的特殊地址空间,允许多个不相关的进程使用

    1
    2
    3
    4
    int shmget(key_t key, int shmflg);
    int shmat(int shmid, const void * shmaddr, int shmflg);
    int shmdt(const void * shmaddr);
    int shmctl(int shmid, int cmd, struct shmid_ds *buf);