操作系统实验之信号量的实现和应用
来源:互联网 发布:手机知乎怎么注册 编辑:程序博客网 时间:2024/06/10 04:51
1.首先复习了下,关于信号量的基本知识,我知道的借口基本有三套了,但是主要的都是解决PV操作,P为:等待,如果信号量不为0,即减1,如果为0的话,即进入等待,V:唤醒P操作等待的线程或者是进程,下面是实验中使用的接口:
//初始化sem_t *sem_open(const char *name, unsigned int value);//P操作int sem_wait(sem_t *sem);//V操作int sem_post(sem_t *sem);//释放int sem_unlink(const char *name);
2)下面是自己写的生产者和消费者测试代码,注意在编译的时候,需要链接:-lpthread
#include <stdio.h>#include <stdlib.h>#include <semaphore.h>#include <sys/sem.h>#include <string.h>#include <unistd.h>#include <fcntl.h>#include <sys/stat.h>#include <sys/types.h>//联系模型生产者和消费者模型//实现一个进程负责生产,N个进程负责消费#define BUFFER_SIZE 10sem_t* empty;sem_t* full;sem_t* mutex;int main(void){ int fd_file = open("pc.log",O_CREAT|O_RDWR,0644); empty = sem_open("empty",O_CREAT,0644,10); full = sem_open("full",O_CREAT,0644,0); mutex = sem_open("mutex",O_CREAT,0644,1); //可以进行生产 //将文件大小设置为0 ftruncate(fd_file,0); //如果有这些信号量的话,先释放 sem_unlink("empty"); sem_unlink("full"); sem_unlink("mutex"); if(!fork()) { //child producer int i = 0; while(i < 500) { i++; sem_wait(empty); sem_wait(mutex); // write the data to file lseek(fd_file,0,SEEK_END); write(fd_file,&i,sizeof(i)); sem_post(mutex); sem_post(full); } while(1); } if(!fork()) { int result = 0; int tmpResult = 0; int fileLen = 0; int j = 0; //consumer while(1) { sem_wait(full); sem_wait(mutex); //读取数据,同时将数据删除,从头开始读 lseek(fd_file,0,SEEK_SET); read(fd_file,&result,sizeof(result)); printf("%ld:%d\n",getpid(),result); // delete data from file fileLen = lseek(fd_file,0,SEEK_END); for(j = 1; j < fileLen/sizeof(result);j++) { lseek(fd_file,j*sizeof(result),SEEK_SET); read(fd_file,&tmpResult,sizeof(tmpResult)); lseek(fd_file,(j - 1)*sizeof(result),SEEK_SET); write(fd_file,&tmpResult,sizeof(tmpResult)); } ftruncate(fd_file,fileLen - sizeof(result)); sleep(1); sem_post(mutex); sem_post(empty); } } if(!fork()) { int result = 0; int tmpResult = 0; int fileLen = 0; int j = 0; while(1) { //consumer sem_wait(full); sem_wait(mutex); //读取数据,同时将数据删除,从头开始读 lseek(fd_file,0,SEEK_SET); read(fd_file,&result,sizeof(result)); printf("%ld:%d\n",getpid(),result); // delete data from file fileLen = lseek(fd_file,0,SEEK_END); for(j = 1; j < fileLen/sizeof(result);j++) { lseek(fd_file,j*sizeof(result),SEEK_SET); read(fd_file,&tmpResult,sizeof(tmpResult)); lseek(fd_file,(j - 1)*sizeof(result),SEEK_SET); write(fd_file,&tmpResult,sizeof(tmpResult)); } ftruncate(fd_file,fileLen - sizeof(result)); sleep(1); sem_post(mutex); sem_post(empty); } } wait(NULL);}
0 0
- 操作系统实验之信号量的实现和应用
- 操作系统实验报告-信号量的实现和应用
- 哈工大操作系统试验4 信号量的实现和应用
- 操作系统原理与实践6-信号量的实现和应用
- 操作系统原理与实践7-信号量的实现和应用
- 信号量的实现和应用
- 信号量的实现和应用
- 信号量的实现和应用
- 操作系统的信号量和管程
- 操作系统:用二值信号量和一些机器指令实现计数信号量
- 操作系统实验——信号量
- Linux 0.11下信号量的实现和应用
- 操作系统 *** 实现信号量
- 生产者-消费者问题实现 (linux下C同步信号量和互斥信号量的应用)
- 操作系统之-----信号量机制
- 操作系统之信号量
- 操作系统实验之主存储器空间的分配和回收
- 操作系统实验四之实现shell
- Linux系统从零到高手的进阶心得
- 论文推荐 推荐系统 Recommender System
- 二叉搜索树、AVL树、B-树、B+树、B*树、红黑树
- 上周热点回顾(2.13-2.19)
- js单例模式
- 操作系统实验之信号量的实现和应用
- 374. Guess Number Higher or Lower
- 5-38 数列求和-加强版 (20分)
- ZOJ 3209 Treasure Map(精确覆盖)
- leeetcode 153. Find Minimum in Rotated Sorted Array
- POJ 2385 Apple Catching 动态规划
- Struts拦截器判断用户是否登陆
- Running GUI apps with Docker
- as笔记3