资源描述:
《linux信号量机制》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux信号量机制1需求说明l提供与用户交互的界面,用户可指定输入、输出文件以及缓冲区大小l利用信号量实现互斥l同时产生多个get、copy和put线程,利用信号量实现多个相同功能的线程间的通信,避免临界资源的非法访问l支持文件输入、输出2设计说明缓冲区S缓冲区Tgetcopyput2.1结构设计2.2功能设计l提供与用户交互的界面,用户可指定输入、输出文件以及缓冲区大小l利用信号量实现互斥l同时产生多个get、copy和put线程,利用信号量实现多个相同功能的线程间的通信,避免临界资源的非法访问l支持文件输入、输出3测试和使用
2、说明3.1使用说明把相应文件都放在同一个文件夹内,然后使用make工具编译,生成mycopy可执行文件即可。3.2测试说明用信号量实现互斥,同时产生多个get、copy和put线程,利用信号量实现多个同功能的线程间的通信,避免临界资源的非法访问。4程序清单Makefilemycopy:main.cinterface.oGet.oCopy.oPut.odef.hgccmain.cinterface.oGet.oCopy.oPut.o-lpthread-omycopyinterface.o:interface.cdef.hgcc-ci
3、nterface.c-lpthread-ointerface.oGet.o:Get.cdef.hgcc-c-lpthreadGet.c-oGet.oCopy.o:Copy.cdef.hgcc-c-lpthreadCopy.c-oCopy.oPut.o:Put.cdef.hgcc-c-lpthreadPut.c-oPut.o/*def.h*/#ifndefDEF_H#defineDEF_H#include#include#include#include#i
4、nclude#include#include#include#include#include#include#defineBUF_SIZE1024#defineP(x)sem_wait(x)#defineV(x)sem_post(x)externintInFD,OutFD;externintBufferSize;externsem_tTempty,Sempty,Sfull,T
5、full;externchar*BufferS,*BufferT;externintSlen,Tlen;voidppput(void);voidccopy(void);voidggget(void);#endif/*main.c*/#include"def.h"intInFD,OutFD;intBufferSize=BUF_SIZE;sem_tTempty,Sempty,Sfull,Tfull;char*BufferS,*BufferT;intSlen,Tlen;voidinitSem(){sem_init(&Sempty,1,1
6、);sem_init(&Sfull,1,0);sem_init(&Tfull,1,0);sem_init(&Tempty,1,1);}voidinitBuffer(){BufferT=(char*)malloc(sizeof(char)*BufferSize);assert(BufferT!=NULL);BufferS=(char*)malloc(sizeof(char)*BufferSize);assert(BufferS!=NULL);Slen=Tlen=0;}intmain(){interface();initSem();i
7、nitBuffer();pthread_tgid,cid,pid;pthread_create(&gid,NULL,(void*)ggget,NULL);pthread_create(&cid,NULL,(void*)ccopy,NULL);pthread_create(&pid,NULL,(void*)ppput,NULL);pthread_join(gid,NULL);pthread_join(cid,NULL);pthread_join(pid,NULL);return0;}/*Get.c*/#include"def.h"v
8、oidggget(){intfuck=1;while(fuck){P(&Sempty);Slen=read(InFD,BufferS,BufferSize);fuck=(Slen!=0);V(&Sfull);}}/*Copy.c*/#include