1.生产者代码
//伪代码
Producer(item)
{
P(empty);
...
V(full);
}
//sem.c 进入内核
//信号量在内核中,包含 value 和 PCB,value的值能被多个进程看到
typedef struct{
char name[20];// name是信号量的名字,比如empty
int value; // value记录供进程判断的值
task_struct * queue; // PCB队列
} semtable[20];
// sem_open的最终实现
sys_sem_open(char *name)
{
在semtable中根据name寻找对应的元素;
如果没找到就创建这个元素;
返回对应的下标;
}
//代码实现 Producer.c
main()
{
sd = sem_open("empty");//通过系统调用sem_open打开内核,共同使用empty这个信号量
//执行5次,在文件中写出5个数字,每个数字占4个字节
for(i = 1 to 5){
sem_wait(sd); // 判断是否有空闲缓冲区
write(fd, &i, 4);
}
}
// sd是下标
sys_sem_wait(int sd){
cli();
// 根据下标取value,value-- < 0 说明没有空闲缓冲区了