Linux信号量机制.docx
- 文档编号:5724094
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:14
- 大小:57.86KB
Linux信号量机制.docx
《Linux信号量机制.docx》由会员分享,可在线阅读,更多相关《Linux信号量机制.docx(14页珍藏版)》请在冰豆网上搜索。
Linux信号量机制
大作业
---Linux信号量机制
姓名:
学号:
班级:
010914
日期:
2012年5月23日
1需求说明
进程A、B、C,分别调用过程get、copy、put对缓冲区S和T进行操作。
其中get负责从文件F_in中把数据块读入并输出缓冲区S,copy负责从S中提取数据块并复制到缓冲区T中,put负责从缓冲区T中取出信息存入到本地文件F_out中。
实现get、copy、put的操作过程。
功能需求:
●提供与用户交互的界面,用户可指定输入、输出文件以及缓冲区大小
●利用信号量实现互斥
●同时产生多个get、copy和put线程,利用信号量实现多个相同功能的线程间的通
信,避免临界资源的非法访问,可参考读写者问题解决方案
●支持文件输入、输出
非功能需求:
●程序应有较好的容错性(即能对用户输入的命令进行判断,并对错误的命令进行错误处理)
过程需求:
●使用vi进行代码的编写
●使用make工具建立工程
●将实现不同类别功能的函数写到不同的.c文件中,并使用makefile链接编译。
2设计说明
2.1结构设计
进程1通过get函数将源文件载入缓冲区S;
进程2通过copy函数将数据从缓冲区S复制到缓冲区T内;
进程3通过put函数将缓冲区T内的数据输出到目标文件。
2.2功能设计
1.提供与用户交互的界面,用户可指定输入、输出文件以及缓冲区大小。
2.利用信号量实现互斥。
3.同时产生多个get、copy和put线程,利用信号量实现多个相同功能的线程间的通信,避免临界资源的非法访问。
3测试和使用说明
3.1使用说明
1、执行make命令,编译程序test;
2、执行test;
3、输入源文件的路径
4、输入目标文件的文件名
5、输入缓冲区大小
6、程序执行完毕
3.2测试说明
执行make命令,编译test。
输入文件fin内容如上图。
./fin
运行可执行程序test,程序请求用户指定输入文件、输出文件和缓冲区大小。
程序获取用户输入后,根据设计要求将输入文件的内容复制到输出文件中,并显示执行过程和执行状态。
输出文件fout如上图所示。
4程序清单
头文件para.h
#include
#include
#include
#include
#include
#include
#include
#definePERMSS_IRUSR|S_IWUSR
FILE*fin,*fout;
intS_sem,S_n,S_e,T_sem,T_n,T_e;
intend_mark;
structsembufsemwait,semsignal;
C文件sem.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
voidinit_semaphore_struct(structsembuf*sem,intsemnum,intsemop,intsemflg)
{
sem->sem_num=semnum;
sem->sem_op=semop;
sem->sem_flg=semflg;
}
intdel_semaphore(intsemid)
{
#if1
returnsemctl(semid,0,IPC_RMID);
#endif
}
C文件get.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"para.h"
voidget(intBUF_SIZE)
{
longlength,times;
intS_segment_id;
char*S_shared_memory;
charstring[1024];
structshmid_dsshmbuffer;
memset(string,'\0',1024);
S_segment_id=shmget(99,BUF_SIZE,IPC_CREAT|0666);
S_shared_memory=(char*)shmat(S_segment_id,NULL,0);
shmctl(S_segment_id,IPC_STAT,&shmbuffer);
fseek(fin,0,SEEK_END);
length=ftell(fin);
fseek(fin,0,SEEK_SET);
times=length/BUF_SIZE;
while(times)
{
fread(string,BUF_SIZE,1,fin);
semop(S_e,&semwait,1);
semop(S_sem,&semwait,1);
strcpy(S_shared_memory,string);
printf("GetFile_inputtoBuffer_SOK,%s\n",S_shared_memory);
semop(S_sem,&semsignal,1);
semop(S_n,&semsignal,1);
times--;
}
printf("EndGetting.\n");
shmdt(S_shared_memory);
}
C文件copy.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"para.h"
voidcopy(intBUF_SIZE)
{
charstring[1024];
intT_segment_id;
char*T_shared_memory;
structshmid_dsT_shmbuffer;
T_segment_id=shmget(100,BUF_SIZE,IPC_CREAT|0666);
T_shared_memory=(char*)shmat(T_segment_id,NULL,0);
shmctl(T_segment_id,IPC_STAT,&T_shmbuffer);
intS_segment_id;
char*S_shared_memory;
structshmid_dsS_shmbuffer;
S_segment_id=shmget(99,BUF_SIZE,IPC_CREAT|0666);
S_shared_memory=(char*)shmat(S_segment_id,NULL,0);
shmctl(S_segment_id,IPC_STAT,&S_shmbuffer);
while(!
end_mark)
{
semop(S_n,&semwait,1);
semop(S_sem,&semwait,1);
strcpy(string,S_shared_memory);
memset(S_shared_memory,'\0',BUF_SIZE);
semop(S_sem,&semsignal,1);
semop(S_e,&semsignal,1);
semop(T_e,&semwait,1);
semop(T_sem,&semwait,1);
strcpy(T_shared_memory,string);
printf("CopyBuffer_StoBuffer_TOK,%s\n",T_shared_memory);
semop(T_sem,&semsignal,1);
semop(T_n,&semsignal,1);
}
printf("EndCopy.\n");
shmdt(S_shared_memory);
shmdt(T_shared_memory);
}
C文件put.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"para.h"
voidput(intBUF_SIZE)
{
intT_segment_id;
char*T_shared_memory;
structshmid_dsT_shmbuffer;
T_segment_id=shmget(100,BUF_SIZE,IPC_CREAT|0666);
T_shared_memory=(char*)shmat(T_segment_id,NULL,0);
shmctl(T_segment_id,IPC_STAT,&T_shmbuffer);
while(!
end_mark)
{
semop(T_n,&semwait,1);
semop(T_sem,&semwait,1);
if(fprintf(fout,"%s",T_shared_memory)>0)
printf("PutBuffer_TtoFile_inputOK,%s\n",T_shared_memory);
memset(T_shared_memory,'\0',BUF_SIZE);
semop(T_sem,&semsignal,1);
semop(T_e,&semsignal,1);
}
printf("EndPutting.\n");
shmdt(T_shared_memory);
}
C文件main.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"para.h"
voidstop()
{
end_mark=1;
}
voidmain()
{
intBUF_SIZE;
char*input=(char*)malloc(1024);
memset(input,'\0',1024);
init_semaphore_struct(&semwait,0,-1,0);
init_semaphore_struct(&semsignal,0,1,0);
S_sem=semget(IPC_PRIVATE,1,PERMS);
S_n=semget(IPC_PRIVATE,1,PERMS);
S_e=semget(IPC_PRIVATE,1,PERMS);
T_sem=semget(IPC_PRIVATE,1,PERMS);
T_n=semget(IPC_PRIVATE,1,PERMS);
T_e=semget(IPC_PRIVATE,1,PERMS);
semop(S_e,&semsignal,1);
semop(S_sem,&semsignal,1);
semop(T_e,&semsignal,1);
semop(T_sem,&semsignal,1);
pid_tpid1,pid2;
while
(1)
{
printf("PleaseinputthepathofFile_input:
");
scanf("%s",input);
if((fin=fopen(input,"rt"))==NULL)
printf("Can'tfindthefile.\n");
elsebreak;
}
while
(1)
{
printf("PleaseinputthepathofFile_output:
");
scanf("%s",input);
if((fout=fopen(input,"wt"))==NULL)
printf("Can'tfindthefile.\n");
elsebreak;
}
while
(1)
{
printf("PleaseinputthesizeofBuffer(intergerlessthan1024):
");
scanf("%d",&BUF_SIZE);
if(BUF_SIZE>1024)
printf("ThesizeofBufferistoobig.\n");
elsebreak;
}
while((pid1=fork())==-1);
if(pid1>0)
{
get(BUF_SIZE);
sleep
(1);
kill(pid1,10);
wait(0);
wait(0);
fclose(fin);
fclose(fout);
del_semaphore(S_sem);
del_semaphore(S_n);
del_semaphore(S_e);
del_semaphore(T_sem);
del_semaphore(T_n);
del_semaphore(T_e);
exit(0);
}
else
{
while((pid2=fork())==-1);
if(pid2>0)
{
signal(10,stop);
copy(BUF_SIZE);
kill(pid2,12);
wait(0);
exit(0);
}
else
{
signal(12,stop);
put(BUF_SIZE);
exit(0);
}
}
}
makefile文件makefile
test:
main.osem.oget.ocopy.oput.o
ccmain.osem.oget.ocopy.oput.o-otest
main.o:
main.cpara.h
cc-cmain.c
sem.o:
sem.c
cc-csem.c
get.o:
get.cpara.h
cc-cget.c
copy.o:
copy.cpara.h
cc-ccopy.c
put.o:
put.cpara.h
cc-cput.c
clean:
rm-f*.o
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 信号量 机制