进程间通信

信号

  • 由于某些错误而产生的事件
  • 可以设定信号触发之后的处理方式,但信号是系统已经确定的
    1
    2
    void (*signals(int signum, void(*hangdler)(int)))(int);
    int sigaction(int signum, const struct sigaction * act, struct sigaction * addr)

管道和命名管道

实质是先进先出,半双工的数据结构,双方通信需要两个管道

  • 管道:只能用于相互关联的进程间通信,如:父子进程
  • 命名管道: = 特殊文件
    1
    2
    mkfifo(const char * pathname, mode_t mode); //建立管道文件
    read() write() close() 均可操作

信号量

主要用于控制多个线程对临界区资源的访问

消息队列

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

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);

共享内存

直接操作内存,不用复制文件 系统创建的特殊地址空间,允许多个不相关的进程使用

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);
-------------------本文结束 感谢您的阅读-------------------
0%