当前位置: 首页 > Linux

多进程双缓冲区读取与处理

时间:2023-04-06 01:57:11 Linux

题目要求在Linux平台下写两个C语言程序,实现如下功能:(1)X和Y两个进程相互配合处理输入文件中的数据,并将处理结果写入输出文件。(2)X进程负责分块读取输入文件,并使用共享内存将输入数据传送给Y进程。(3)Y进程负责将读取到的数据(假设为文本数据)全部处理成大写,然后写入到输出文件中。(4)为了提高并行效率,在X和Y进程之间创建了两个共享内存区域A和B。X将数据读入A区,然后利用Linux信号或信号量机制通知Y进程进行处理;当Y处理完A区的数据后,X继续将数据读入B区;B区数据填满后,X进程通知Y进程处理,然后继续往A区读数据。如此循环直到处理完所有数据。问题解决#include#include#include#include#include#include#include#include#includeconstintBUFFER_SIZE=2048;intmain(intargc,charconst*argv[]){argv[1];//文件intinputFile,outputFile;inputFile=open(argv[1],O_RDONLY);if(inputFile<=0){printf("没有文件%s\n",argv[1]);返回0;}outputFile=open("./output.txt",O_WRONLY|O_CREAT,0666);//信号量sem_t*sem1;sem_t*sem2;sem1=sem_open("sem1",O_CREAT,0666,1);sem2=sem_open("sem2",O_CREAT,0666,0);//共享内存//定义交换空间结构structswitchBuffer{charbuffer[BUFFER_SIZE];内部标志;};结构switchBuffer*缓冲区;//交换空间a,bstructswitchBuffer*bufferb;intshmaId,shmbId;//创建共享内存shmaId=shmget((key_t)11,sizeof(buffera),0666|IPC_创建);shmbId=shmget((key_t)22,sizeof(bufferb),0666|IPC_CREAT);//主进程读取数据//子进程处理cpid后将数据写入pid_t;cpid=fork();if(cpid<0){printf("fork错误\n");}elseif(cpid==0){//子进程printf("子进程pid:%d\t",getpid());//共享内存映射到进程空间buffera=(structswitchBuffer*)shmat(shmaId,0,0);bufferb=(structswitchBuffer*)shmat(shmbId,0,0);int开关标志=1;while(1){sem_wait(sem2);如果(switchFlag){for(inti=0;iflag;++i){buffera->buffer[i]=toupper(buffera->buffer[i]);}write(outputFile,buffera->buffer,buffera->flag);}else{for(inti=0;iflag;++i){bufferb->buffer[i]=toupper(bufferb->buffer[i]);}write(outputFile,bufferb->buffer,bufferb->flag);}switchFlag=!switchFlag;sem_post(sem1);}}else{//主进程//共享内存映射到进程空间buffera=(structswitchBuffer*)shmat(shmaId,0,0);bufferb=(structswitchBuffer*)shmat(shmbId,0,0);int文件标志=0;int开关标志=1;//1.读取文件->缓冲区a//2.等待处理//3.触发处理//4.读取文件->缓冲区b//5.等待处理//6.触发处理//触发2提前开始,开始运行任务//通过读取文件为0判断终止条件//终止后,等待处理线程处理完最后一个缓冲区while(1){if(switchFlag){fileFlag=读取(输入文件,缓冲区->缓冲区,BUFFER_SIZE);buffera->flag=fileFlag;}else{fileFlag=read(inputFile,bufferb->buffer,BUFFER_尺寸);bufferb->flag=fileFlag;}switchFlag=!switchFlag;如果(文件标志<=0)中断;sem_wait(sem1);sem_post(sem2);}sem_wait(sem1);}//销毁close(inputFile);关闭(输出文件);sem_close(sem1);sem_close(sem2);sem_unlink("sem1");sem_unlink("sem2");shmdt(缓冲区);shmdt(缓冲器);shmctl(shmaId,IPC_RMID,0);shmctl(shmbId,IPC_RMID,0);printf("超过\n");return0;}欢迎来到我的个人博客ximikang.icu