一、无名管道
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*/);