【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信号->进程终止

在这里插入图片描述
【Linux】IPC_第1张图片
在这里插入图片描述
注: 写入1 代替dup printf

FIFO

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

  • 特点:必须一个打开,一个关闭,才能同时继续进行程序
    access
    【Linux】IPC_第2张图片

  • 上图改进版:
    【Linux】IPC_第3张图片
    【Linux】IPC_第4张图片

共享存储

  • 最快的IPC
  • 流程:【Linux】IPC_第5张图片
  1. ftok(samepath, sameid) //获取 key
  2. shmget(key, size, shmflg) //获取id
shmflg
IPC_CREAR
IPC_EXCL

【Linux】IPC_第6张图片

  • ipcs 查看共享内存
    【Linux】IPC_第7张图片
  1. shmat(shmid, addr, smflg) //挂载shm返回地址addr
    在这里插入图片描述
    【Linux】IPC_第8张图片
  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
    【Linux】IPC_第9张图片
IPC_RMID 删除一个信号
SETVAL 设置agc.val
GETVAL
  • semop(semid, sops, nsops)
    sops:指向元素操作数组
    nsops:信号量元素操作个数

【Linux】IPC_第10张图片
– P操作

【Linux】IPC_第11张图片
– V操作
【Linux】IPC_第12张图片

你可能感兴趣的:(Linux)