【Linux】IPC
通信方式 | 作用范围 | 特点 |
---|---|---|
信号 | 亲缘/非亲缘 | 自身 |
管道 | 亲缘 | |
命名管道FIFO | 亲缘/非亲缘 | |
共享内存 | 亲缘/非亲缘 | 最快的IPC,无需内存拷贝 |
信号量semaphore | 亲缘/非亲缘/线程间 | 不做数据传输 |
套接字 | 还没学 | |
消息队列 | 还没学 |
流程
管道
- pipe一个fd
- fork
- 处理父子进程的fd[0] fd[1]
- 使用(printf可以用write 1号文件)
FIFO
- mkfifo一个fifo文件
- read这个阻塞函数打开fifo,一个只读,一个只写(read > 0来判断文件能否使用)
- write使用
共享存储shm (share memory)
- ftok一个key
- (用key)shmget一个id
- shmat 挂载shm并返回一个addr地址
- 使用
- shmdt 卸载shm
- shmctl 删除shm
信号量sem (semaphore)
- ftok一个key
- (用key)semget一个id
- semget时,semctl,SETVAL设置agc.val
- semctl,GETVAL获取状态
- 设置sembuf结构体对该结构体进行操作信号量
- 使用该操作
管道
- unistd.h
- pipe(filedes[2])//新建filedes管道数组
- 设计管道和网络通信,需要忽略SIGPIPE
- f[0] 为读打开, f[1] 为写打开
- 半双工
- 父子进程通信的方式,一端读,一端写。
- 写端关闭,read返回0
- 读端关闭,写端收到SIGPIPE信号->进程终止
注: 写入1 代替dup printf
FIFO
-
管道文件不能以读写方式打开
-
特点:必须一个打开,一个关闭,才能同时继续进行程序
access -
上图改进版:
共享存储
- 最快的IPC
- 流程:
- ftok(samepath, sameid) //获取 key
- shmget(key, size, shmflg) //获取id
shmflg | |
---|---|
IPC_CREAR | |
IPC_EXCL |
- ipcs 查看共享内存
- shmat(shmid, addr, smflg) //挂载shm返回地址addr
- shmdt
- 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操作