进程间通讯(二) 无名管道 & 信号量

本文详细介绍了无名管道的概念、使用限制及操作方法,并深入探讨了信号量的原理及其在进程同步控制中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、无名管道

1、无名管道是由系统控制,相对于有名管道而言的。无名管道在使用时产生,不使用时释放,并不会在系统上留下任何痕迹,所以在释放之后你并不知道哪一块被用过。

2、使用限制:和有名管道相比,有名管道可以用于任意两个进程(包括父子进程),而无名管道因为使用前没有任何标识,所以只能用于父子进程之间,没有关系的两个进程不能打开无名管道。

父子进程之间的有关系是因为子进程会拷贝父进程的文件表数组。(浅拷贝)父进程在产生子进程之前在内存开辟了一块空间,等到子进程产生以后也可以找到这块内存。

3、无名管道不是普通文件,也不是通过mkfifo创建的。

二、无名管道操作

1、创建和打开 :pipe

   创建和打开同时进行,成功 返回0; 失败 返回-1;

   int pipe(int fd[2]); 2在这没有意义,之所以是2的原因是一个读,一个写。

   所以pipe的作用是:创建一个文件管道同时打开。 fd[0]读   fd[1]写

   调用:pipe(数组名)  [数组名提前定义下标为2个就行]

2、读:read ( fd[0],buff,sizeof) 

3、写:write ( fd[1],buff,len)

4、关闭:close( fd[0]);   close( fd[1])

   因为close只接收一个参数,所以需要关闭两次,顺序无所谓。

注意:管道文件都是半双工通讯,而无名管道创建后,父进程在fork产生子进程后两个进程只有一对读写,所以要在父子进程分别关闭读或写。

三、信号量

1、临界资源

   临界资源是一个值、资源,被访问控制。同一时刻,只能被一个进程访问的资源。例如:单核cpu,ATM机,使用时得进程访问控制有一定的秩序。

2、临界区

   临界区是一个时间段、区、操作过程。访问临界资源代码区域。(时间段:从开始到结束)

3、原子操作

   原子操作不可再分,在任何情况下都不能打断的操作。

4、内核对象

   内核对象是一种通讯方式、值的记录。内核:在系统层次下的,对象:类和对象;和结构体(类型/变量)相似。

   结构体和类的区别:结构体内是成员变量;类中有成员变量、属性、针对于成员变量的操作。

   用于对进程间通讯时,多进程能够访问同一资源的记录。

5、信号量的作用:(1)进程间同步控制,相当于记录资源能同时被多少个进程访问。

                 (2)记录资源能被进程访问的个数。

   信号量控制伪临界资源,量:访问数量的限制;和“锁”类似,不同的是锁一旦锁住不能再进,而信号量做了控制后还可以进。

   因为被访问的进程数量有限,所以在第一次生成时应同时初始化。

6、信号量的操作

   创建或获取如果是创建,第一次生成时必须初始化;如果是获取,则不能初始化。

   减一操作:P操作(在系统上) 占用一个,总数减一 

   加一操作:V操作  清除一个,现在的总数加一

   删除操作:因为内核由对象,所以存在删除。管道、信号无删除。

7、系统提供的三个函数

   (1)创建/获取操作:int semget((key_t)key,int nsems,int semflg);

   信号量在内核维护时,不是get一次创建一个信号量,而是会创建一个信号集(多个信号量在一个内存中),所以在内核中维护一个集合(数组).

   (2)P/V操作:int semop(int semid, struct sembuff *buf,int lenth);

     如果操作一个,给变量取地址,大小为1。

   (3)int semctl(int semid, int pos,int cmd, /*union semun*/);


 

   




   

  

   









      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值