【Linux】IPC

通信方式作用范围特点
信号亲缘/非亲缘自身
管道亲缘
命名管道FIFO亲缘/非亲缘
共享内存亲缘/非亲缘最快的IPC,无需内存拷贝
信号量semaphore亲缘/非亲缘/线程间不做数据传输
套接字还没学
消息队列还没学

流程

管道

  1. pipe一个fd
  2. fork
  3. 处理父子进程的fd[0] fd[1]
  4. 使用(printf可以用write 1号文件)

FIFO

  1. mkfifo一个fifo文件
  2. read这个阻塞函数打开fifo,一个只读,一个只写(read > 0来判断文件能否使用)
  3. write使用

共享存储shm (share memory)

  1. ftok一个key
  2. (用key)shmget一个id
  3. shmat 挂载shm并返回一个addr地址
  4. 使用
  5. shmdt 卸载shm
  6. shmctl 删除shm

信号量sem (semaphore)

  1. ftok一个key
  2. (用key)semget一个id
  3. semget时,semctl,SETVAL设置agc.val
  4. semctl,GETVAL获取状态
  5. 设置sembuf结构体对该结构体进行操作信号量
  6. 使用该操作

管道

  • unistd.h
  • pipe(filedes[2])//新建filedes管道数组
  • 设计管道和网络通信,需要忽略SIGPIPE
  • f[0] 为读打开, f[1] 为写打开
  • 半双工
  • 父子进程通信的方式,一端读,一端写。
  • 写端关闭,read返回0
  • 读端关闭,写端收到SIGPIPE信号->进程终止

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注: 写入1 代替dup printf

FIFO

  • 管道文件不能以读写方式打开

  • 特点:必须一个打开,一个关闭,才能同时继续进行程序
    access
    a4b666c5245d95104dc03579ad184fb1.png

  • 上图改进版:
    45eaee0b30708e47474c84b1d702da73.png
    782f6476aab3a9ec3c815bcf0dc25497.png

共享存储

  • 最快的IPC
  • 流程:在这里插入图片描述
  1. ftok(samepath, sameid) //获取 key
  2. shmget(key, size, shmflg) //获取id
shmflg
IPC_CREAR
IPC_EXCL

在这里插入图片描述

  • ipcs 查看共享内存
    在这里插入图片描述
  1. shmat(shmid, addr, smflg) //挂载shm返回地址addr
    在这里插入图片描述
    在这里插入图片描述
  2. shmdt
    在这里插入图片描述
  3. shmctl(id, IPC_RMID, NULL)
  • 删除共享内存(需要所有进程都结束才能删除)
IPC_STAT
IPC_SET
IPC_RMID删除共享存储段
SHM_LOCK
SHM_UNLOCK

信号量

  • 是一个计数器(线程上限)
  • semget( key, nSemes, flag)
    nSemes: //创建几个信号量1,2,3,4
  • semctl(semid, semnum, )//设置停车场有几个停车位0,01,012,0123
    在这里插入图片描述
IPC_RMID删除一个信号
SETVAL设置agc.val
GETVAL
  • semop(semid, sops, nsops)
    sops:指向元素操作数组
    nsops:信号量元素操作个数

在这里插入图片描述
– P操作

在这里插入图片描述
– V操作
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值