-
管道
无名管道,传送内容均为无格式字节流,半双工,先进先出,具有固定的读端和写端,只能用于有亲缘关系的进程间通信(父子进程或兄弟进程之间),可以使用read、write读写,但不属于文件系统,仅存在于内存中
建立管道,创建两个文件描述符,fd[0]读端,fd[1]写端,关闭描述符即可关闭管道int pipe(int fd[2]);
-
FIFO
有名管道,传送内容均为无格式字节流,半双工,先进先出,可以在任意进程间通信,与路径名关联,作为特殊设备文件存在于文件系统中,但读写都在内存缓冲区中进行int mkfifo(const char *pathname, mode_t mode); mode:设置权限
-
Streams
Streams管道是一个全双工管道 -
消息队列
消息队列是消息的链表,由消息队列标识符(队列ID)来标识,存放在内存中,由内核维护
消息队列中的消息有类型和格式,可以按消息类型选择读取,不一定先进先出,读取后被删除
消息队列标识符唯一,内核重启或者手动删除时消息队列才会删除,否则一直存在系统中ftok(const char *pathname, inr proj_id); pathname:路径名 proj_id:项目ID int msgget(key_t key, int msgflg); key:IPC键值 msgflg:标识函数的行为及消息队列的权限 int magsnd(int msqid, const void *msgp, size_t msgsz, int msgflag); msqid:消息队列标识符 msgp:待发送的消息结构体地址 msgsz:消息正文字节数 int magrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflag); msqid:消息队列标识符 msgp:待发送的消息结构体地址 msgtyp:消息类型 msgsz:消息正文字节数 int magctl(int msqid, int cmd, struct msqid_ds *buf); msqid:消息队列标识符 cmd:函数功能控制 buf:类型地址,用于操作消息队列属性
-
信号
不同信号用不同的值表示,每个信号设置相应的函数,一旦进程发送某一个信号给另一个进程,另一进程将执行相应的函数进行处理 -
信号量
作为一个计数器,分为无名信号量(线程间同步和互斥)和有名信号量(进程间通信),p消费资源,v增加资源,为正数时资源空闲int semget(key_t key, int num_sems, int sem_flags); 创建或获取一个信号量组 int semop(int semid, struct sembuf semoparry[], size_t numops); 对信号量组进行操作,改变信号量的值 int semctl(int demid, int sem_num, int cmd, ...); 控制信号量的相关信息
-
Socket
使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程 -
共享内存
进程间通信最快方法,由一个进程创建共享区域,允许其他进程共享给定的存储区域,一般和其他进程间通信组合使用,例如信号量,单个共享内存默认最大32Mint shmget(key_t key, size_t size, int shmflg); 创建或打开一块共享内存,返回共享内存标识符 key:IPC键值 size:共享存储段长度 shmflg:标识函数的行为和共享内存的权限 void *shmat(int shmid, const void *shmaddr, int shmflg); 将一个共享内存段映射到进程的数据段中,返回映射地址 shmid:共享内存标识符 shmaddr:映射地址,一般NULL shmflg:访问权限和映射条件 int shmdt(const void *shmaddr); 去关联共享内存 shmaddr:关联共享内存的虚拟空间地址 int shmctl(int shmid, int cmd, struct shmid_ds *cmd); 共享内存空间的控制 shmid:共享内存标识符 cmd:函数控制功能 buf:类型地址,用于存放或修改共享内存属性
-
进程间通信方式比较
进程间通信
于 2021-07-22 11:34:10 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)