1、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线程,利用信号量实现多个相同功能的线程间的通信,避免临界资源的非法
2、访问,可参考读写者问题解决方案 支持文件输入、输出非功能需求: 程序应有较好的容错性(即能对用户输入的命令进行判断,并对错误的命令进行错误处理)过程需求: 使用vi进行代码的编写 使用make工具建立工程 将实现不同类别功能的函数写到不同的.c文件中,并使用makefile链接编译。2 设计说明2.1 结构设计 进程1通过get函数将源文件载入缓冲区S;进程2通过copy函数将数据从缓冲区S复制到缓冲区T内;进程3通过put函数将缓冲区T内的数据输出到目标文件。2.2 功能设计1.提供与用户交互的界面,用户可指定输入、输出文件以及缓冲区大小。2.利用信号量实现互斥。3.同时产生多个get、co
3、py和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 #inclu
4、de #include #include #include #include #include #define PERMS S_IRUSR|S_IWUSRFILE *fin,*fout;int S_sem,S_n,S_e,T_sem,T_n,T_e;int end_mark;struct sembuf semwait,semsignal;C文件sem.c #include #include #include #include #include #include #include #include #include void init_semaphore_struct(struct sembuf
5、 *sem,int semnum,int semop,int semflg) sem-sem_num = semnum; sem-sem_op = semop; sem-sem_flg = semflg;int del_semaphore(int semid)#if 1 return semctl(semid,0,IPC_RMID);#endifC文件get.c #include #include #include #include #include #include #include #include #include #include #include para.hvoid get(int
6、 BUF_SIZE) long length,times; int S_segment_id; char *S_shared_memory; char string1024; struct shmid_ds shmbuffer; 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,SEE
7、K_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(Get File_input to Buffer_S OK,%sn,S_shared_memory); semop(S_sem,&semsignal,1); semop(S_n,
8、&semsignal,1); times-; printf(End Getting.n); shmdt(S_shared_memory);C文件copy.c #include #include #include #include #include #include #include #include #include #include #include para.hvoid copy(int BUF_SIZE) char string1024; int T_segment_id; char *T_shared_memory; struct shmid_ds T_shmbuffer; T_seg
9、ment_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); int S_segment_id; char *S_shared_memory; struct shmid_ds S_shmbuffer; S_segment_id = shmget(99,BUF_SIZE,IPC_CREAT|0666); S_shared_memory = (char *)shmat(S_
10、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); str
11、cpy(T_shared_memory,string); printf(Copy Buffer_S to Buffer_T OK,%sn,T_shared_memory); semop(T_sem,&semsignal,1); semop(T_n,&semsignal,1); printf(End Copy.n); shmdt(S_shared_memory); shmdt(T_shared_memory);C文件put.c #include #include #include #include #include #include #include #include #include #inc
12、lude #include para.hvoid put(int BUF_SIZE) int T_segment_id; char *T_shared_memory; struct shmid_ds T_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
13、); semop(T_sem,&semwait,1); if (fprintf(fout,%s,T_shared_memory) 0) printf(Put Buffer_T to File_input OK,%sn,T_shared_memory); memset(T_shared_memory,0,BUF_SIZE); semop(T_sem,&semsignal,1); semop(T_e,&semsignal,1); printf(End Putting.n); shmdt(T_shared_memory);C文件main.c #include #include #include #i
14、nclude #include #include #include #include #include #include #include para.hvoid stop() end_mark = 1;void main() int BUF_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
15、); 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_t pid1,pid2;
16、 while (1) printf(Please input the path of File_input:); scanf(%s,input); if ( (fin = fopen(input,rt) = NULL ) printf(Cant find the file.n); else break; while (1) printf(Please input the path of File_output:); scanf(%s,input); if ( (fout = fopen(input,wt) = NULL ) printf(Cant find the file.n); else
17、break; while (1) printf(Please input the size of Buffer (interger less than 1024):); scanf(%d,&BUF_SIZE); if ( BUF_SIZE 1024 ) printf(The size of Buffer is too big.n); else break; while(pid1 = fork() = -1); if (pid1 0) get(BUF_SIZE); sleep(1); kill(pid1,10); wait(0); wait(0); fclose(fin); fclose(fou
18、t); 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.o sem.o get.o copy.o put.o cc main.o sem.o get.o copy.o put.o -o testmain.o:main.c para.h cc -c main.csem.o:sem.c cc -c sem.cget.o:get.c para.h cc -c get.ccopy.o:copy.c para.h cc -c copy.cput.o:put.c para.h cc -c put.cclean: rm -f *.o