进程间通信

本文详细介绍了无名管道、有名管道(FIFO)、Streams管道、消息队列、信号、信号量、Socket、共享内存这八种进程间通信方式。它们各自有不同的特点和适用场景,如管道适用于亲缘进程,FIFO可在任意进程间通信,消息队列支持按类型读取,信号量用于同步和互斥,Socket则可用于网络通信,共享内存则是最快的通信方式之一。理解这些通信方式对于系统级编程至关重要。
摘要由CSDN通过智能技术生成
  • 管道
    无名管道,传送内容均为无格式字节流,半双工,先进先出,具有固定的读端和写端,只能用于有亲缘关系的进程间通信(父子进程或兄弟进程之间),可以使用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进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程

  • 共享内存
    进程间通信最快方法,由一个进程创建共享区域,允许其他进程共享给定的存储区域,一般和其他进程间通信组合使用,例如信号量,单个共享内存默认最大32M

    int 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:类型地址,用于存放或修改共享内存属性
    
  • 进程间通信方式比较 进程间通信比较

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值