时间:2021-05-20
最近学习了操作系统的并发;以下是关于进程间实现并发,通信的两个方法。
1:利用管道进行进程间的通信
用到下列函数
管道只能用于具有亲缘关系的进程,可以将其看作一个文件,但有别于普通的文件, 管道一次只可以被一个进程访问,能实现互斥;
pipe(int fd[] ), 其参数为长度为2的int数组,分别代表读端fd[0], 写端fd[1], 在创建管道后,f d[0],fd[1]成为文件描述符;
写入(write)管道一端fd[1]的数据,在管道的另一端fd[0]可以被进程读取(read);
代码
2:利用共享内存实现通信, 信号量实现互斥
共享内存使用了以下函数:
intshm_open(const char *name, int oflag, mode_t mode); //创建或打开共享内存, 返回文件描述符
intftruncate(int fd, off_t FILE_SIZE); //调整共享内存空间大小
void*mmap( void * addr , size_t len , int prot , int flags , int fd , off_t offset ) //将文件映射到进程的地址空间,返回指向地址空间的指针
intmunmap(void *start, size_t length); //解除地址映射
intshm_unlink(const char *name); //删除shm_open()创建的共享内存
函数具体用法,可见链接,讲述的很详细了;
具体思路:
一:实现进程间的通信,无非就是各进程间数据的交流,传输;
1、shm_open()函数是创建或打开一个已存在(唯一的name)的共享内存,返回文件描述符,可以看作是创建或打开了一个文件,说法不同而已
2、ftruncate()函数用于指定文件(fd)有多大
3、关键步骤就是mmap(),它将指定的文件(fd)或其他对象映射到内存, 得到可以直接操作的指针对象,不需调用write, read等
4、然后就是在使用完成后需要解除映射munmap(), 和删除创建的共享内存(name)shm_unlink(),; 对于做打开共享内存操作的进程,也需要执行这些操作(1,2,3,4)
二:然后使用信号量实现互斥:
互斥的意思为:当一个进程在临界区访问共享资源时,其他进程不能进入该临界区访问任何共享资源
临界区代表进程将访问共享资源的一段代码
当我们在向共享区写入数据时,显然不想多个进程同时访问,因为会造成不必要的麻烦,就需要信号量来实现这种互斥的机制
sem_t *sem_open(const char *name,int oflag,mode_t mode,unsigned int value) //创建或打开一个存在的(name)信号量
intsem_wait(sem_t *sem) // 使信号量(value)减1,若信号量小于0,则阻塞执行semwait()的进程
临界区代码一般存在于这两个调用之间,比如:当前进程向共享区写数据,如受到sem_wait阻塞,表示资源已经用尽或其他进程正在访问,需等待
intsem_post(sem_t *sem) // 当前进程离开临界区时,使信号量(value)加1,
intsem_unlink(count char *name) //删除信号量
函数具体用法,可见链接,讲述的很详细了;
代码
需要注意的是:
1:在使用共享内存和信号量时要注意,有些调用是使用的共享内存和信号量的name, 但有些是使用的创建或打开他们的返回值(fd和sem_t*)
2:如在子进程创建之前,父进程已创建了共享内存或信号量,则子进程无需在进行打开操作,可直接使用
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了C语言实现查看进程是否存在的方法。分享给大家供大家参考,具体如下:#include#include#include#include#include
本文实例为大家分享了C语言实现页面置换算法的具体代码,供大家参考,具体内容如下一、设计目的加深对请求页式存储管理实现原理的理解,掌握页面置换算法中的先进先出算法
本文实例讲述了C#使用SendMessage实现进程间通信的方法。分享给大家供大家参考。具体分析如下:为了深入理解消息机制,先来做一个测试项目在新建项目的For
一、Binder机制概述在Android开发中,很多时候我们需要用到进程间通信,所谓进程间通信,实现进程间通信的机制有很多种,比如说socket、pipe等,A
本文实例讲述了基于C语言实现的迷宫算法。分享给大家供大家参考,具体如下:利用c语言实现迷宫算法,环境是vc++6.0.#include#include#incl