进程间通信

进程间通信的目的
数据传输:一个进程需要把数据发送给另一个进程
资源共享:多个进程共享资源
通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变

进程间通信的方式:
管道:
1.匿名管道
2.命名管道
system v ipc:
1.system v 消息队列
2.system v共享内存
3.信号量
posix ipc:
1.消息队列
2.共享内存
3.信号量
4.互斥量
5.读写锁
6.条件变量

匿名管道
使用pipe函数创建一个匿名的管道文件(内核文件): int pipe(int fd[2]);
给pipe函数传入一个数组fd文件描述符数组 fd[0] 管道读端文件描述符 fd[1] 管道写端描述符返回值0表成功 否则返回非0并会设置错误码
匿名管道实现文件共享的方式:
主进程创建匿名管道文件 然后创建子进程 子进程将会继承父进程的大部分数据和tcb信息 自然管道描述符也将继承 然后根据需求关闭两进程对应的端口 然后可以实现通信
但是这个方法局限性太强了 只能是有亲属关系的进程间通信
read函数读取管道内数据 当管道内没有数据将会阻塞 相同write函数写入数据 如果管道写满了
write也将阻塞 直到数据被读走
当管道写端全部关闭 read将会返回0 当读端全部关闭 write则会产生信号SIGPIPE 导致进程退出
其中有一个管道参数 PIPE_BUF 管道缓存大小 ulimt -a可以查看(pipe size) linux默认是4096字节 PIPE_BUF是指原子操作的最大值,pipe size是指管道的最大值
当一次写入的数据大于PIPE_BUF则写入不能保证原子性 小于PIPE_BUF就是原子性的
管道的生命周期随着进程的生命周期
命名管道
命名管道创建一个fifo文件(内存文件) 可以在命令行创建 mkfifo 跟上文件名
也可以使用函数mkfifo创建 int mkfifo(const char *filename,mode_t mode);
函数参数传入一个文件名和权限mode为该文件的权限(mode%~umask)
命名管道将在当前文件夹下看到 使用时需要先用open函数先打开文件 然后就可以在不同进程访问这个文件进行通信 命名管道不同与匿名管道就是不需要有血缘关系
当不需要使用命名管道 可以使用ulink函数删除

system v共享内存
共享内存是最快的通信方式 因为共享内存是在内存上开辟一片空间 各个进程直接访问内存
通信方法 :因为内存标识符只有一个 所有我们可以封装一个函数用于获取内存 然后搞成hpp文件
需要使用的进程都可以引用这个文件然后调用函数获取文件标识符再关联内存与进程
shmget函数创建共享内存 int shmget(key_t key, size_t size, int shmflg
参数是 一个名字,需要的内存大小,创建的权限(和文件权限一样) 返回值是一个整数 就是这个共享内存的标识符
shmat函数把共享内存关联到 当前进程
void *shmat(int shmid, const void *shmaddr, int shmflg);
shmid就是共享内存的描述符 shmaddr 是一个地址一般设置位nullptr由内核自己选
shmflg:它的两个可能取值是SHM_RND( shmaddr 非空时才有效)和SHM_RDONLY(只读)
函数返回值是一个指针 指向共享内存的开头位置 用于操作内存
shmdt是共享内存与当前进程脱离 int shmdt(const void *shmaddr);
参数就是shmat函数返回的指针
shmctl函数用于控制共享内存 int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmid:由shmget返回的共享内存标识码
cmd:将要采取的动作(有三个可取值)
buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
在这里插入图片描述
所有我们可以在不需要使用共享内存后 调用shmctl函数 将cmd设置位IPC_RMID 以函数共享内存

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值