学习笔记:from2019/08/15.
第4章 管道和FIFO
4.1 概述
管道是最初的UNIX IPC
形式,可追溯到1973年的UNIX
第三版。
FIFO
有时称为有名管道(named pipe
).
管道和FIFO
都是使用read
和write
函数访问的。
4.3 管道
所有Unix
都提供管道,它由pipe
函数创建,提供一个单路(单向)数据流。
#include <unistd.h>
int pipe(int fd[2]);
//OK return 0; Error return -1
第10章 POSIX
信号量
10.1 概述
信号量(semaphore
)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。
一个进程可以在某个信号量上执行的三种操作:
(1)创建(create
)一个信号量。
(2)等待(wait
)一个信号量。该操作会测试这个信号量的值,如果其值小于或等于0,那就等待,阻塞,一旦其值变为大于0就将它减1.伪代码如下:
while(semahore_value <= 0)
; //wait;i,e.,block the thread or process.
semaphore_value--;
//we have the semaphore
也称P
操作,荷兰语proberen
(尝试),也称递减或上锁。
(3)挂出(post
)一个信号。该操作将使信号量的值加1.
最初称为V
操作,代表荷兰语verhogen
(增加),也称为递增、解锁、发信号。
计数信号量,初始化为某个值**N**
,指示可用的资源数,譬如说缓冲区。
二值信号量可用于互斥目的,就像互斥锁一样:
/* 初始化互斥锁 │ 初始化信号量为1; */
pthread_mutex_lock(&mutex); │ sem_wait(&sem);
/* 临界区 │ 临界区 */
pthread_mutex_unlock(&mutex); │ sem_post(&sem);
生产者消费者伪代码:
get
初始化为0;//数据数
put
初始化为1;//空白数
//生产者
for (;;){
sem_wat(&put);
//把数据放入缓冲区
sem_post(&get);
}
//消费者
for (;;){
sem_wait(&get);
//处理缓冲区中的数据
sem_post(&put);
}
POSIX
提供两类信号:有名信号量(named
)和基于内存的信号量(memory-based
).后者也称为无名信号量(unnamed
).