实验文件操作_第1页
实验文件操作_第2页
实验文件操作_第3页
实验文件操作_第4页
实验文件操作_第5页
已阅读5页,还剩21页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学生姓名:李亚军学号:96专业班级:卓越计科121班1.实验目的通过编写文献读写及上锁的程序,进一步熟悉Linux中文献I/O有关的应用开发,并且纯熟掌握open()、read()、write()、fcntl()等函数的使用。2.实验内容在Linux中FIFO是一种进程之间的管道通信机制。Linux支持完整的FIFO通信机制。本实验内容,通过使用文献操作,仿真FIFO(先进先出)构造以及生产者-消费者运行模型。本实验中需要打开两个虚拟终端,分别运行生产者程序(producer)和消费者程序(customer)。此时两个进程同时对同一种文献进行读写操作。由于这个文献是临界资源,因此能够使用文献锁机制来确保两个进程对文献的访问都是原子操作。先启动生产者进程,它负责创立仿真FIFO构造的文献(其实是一种普通文献)并投入生产,就是按照给定的时间间隔,向FIFO文献写入自动生成的字符(在程序中用宏定义选择使用数字还是使用英文字符),生产周期以及要生产的资源数通过参数传递给进程(默认生产周期为1s,要生产的资源数为10个字符)。后启动的消费者进程按照给定的数目进行消费,首先从文献中读取对应数目的字符并在屏幕上显示,然后从文献中删除刚刚消费过的数据。为了仿真FIFO构造,此时需要使用两次复制来实现文献内容的偏移。每次消费的资源数通过参数传递给进程,默认值为10个字符。3.实验环节(1)实验流程图本实验的两个程序的流程图如图:开始 开始(producer) (customer)消费资源创立FIFO构造文献 (打印字符)否消费够了吗生产一种资源是上锁上锁将剩余的数据拷贝到等待 临时文献tmp中一秒 将“生产”的字符写入到FIFO构造文献用临时文献tmp覆盖原数据文献,这样模拟FIFO构造解锁解锁生产完了吗删除临时文献结束 结束图节流程图(2)代码头部文献代码:structmyflock{shortl_type;/*文献锁类型:F_RDLOCK读取锁;F_WRLCK写入锁;F_UNLCK解锁*/off_tl_start;/*相对位移量*/shortl_whence;/*相对位移量的起点SEEK_SET;SEEK_CUR;SEEK_END:*/off_tl_len;/*加锁区域长度*/pid_tl_pid;/**/};/*lock_set*/intlock_set(intfd,inttype){structmyflockold_lock,lock;=SEEK_SET;=0;=0;=type;=-1;/*判断文献与否能够上锁*/fcntl(fd,F_GETLK,&lock);if!=F_UNLCK){/*判断文献不能上锁的因素*/if==F_RDLCK)/*该文献已有读取锁*/{printf("Readlockalreadysetby%d\n",;}elseif==F_WRLCK)/*该文献已有写入锁*/{printf("Writelockalreadysetby%d\n",;}}/*l_type可能已被F_GETLK修改正*/=type;/*根据不同的type值进行阻塞式上锁或解锁*/if((fcntl(fd,F_SETLKW,&lock))<0){printf("Lockfailed:type=%d\n",;return1;}switch{caseF_RDLCK:printf("Readlocksetby%d\n",getpid());break;caseF_WRLCK:printf("Writelocksetby%d\n",getpid());break;caseF_UNLCK:printf("Releaselockby%d\n",getpid());return1;break;default:break;}/*endofswitch */return0;}生产者程序的源代码:/**/#include<>#include<>#include<>#include<>#include<>#include""#defineMAXLEN 10/*缓冲区大小最大值*/#defineALPHABET 1/*表达使用英文字符*/#defineALPHABET_START'a'/*头一种字符,能够用'A'*/#defineCOUNT_OF_ALPHABET26/*字母字符的个数*/#defineDIGIT2/*表达使用数字字符*/#defineDIGIT_START'0' /*头一种数字字符*/#defineCOUNT_OF_DIGIT10 /*数字字符的个数*/#defineSIGN_TYPEALPHABET /*本实例用英文字符*/constchar*fifo_file="./myfifo"; /*!"FIFO文献名*/charbuff[MAXLEN]; /*缓冲区*//*函数product()产生一种字符并写入仿真FIFO文献中*/introduct(void){intfd;unsignedintsign_type,sign_start,sign_count,size;staticunsignedintcounter=0;/*打开!"FIFO文献*/if((fd=open(fifo_file,O_CREAT|O_RDWR|O_APPEND,0644))<0){printf("Openfifofileerror\n");exit(1);}sign_type=SIGN_TYPE;switch(sign_type){caseALPHABET:/*英文字符*/{sign_start=ALPHABET_START;sign_count=COUNT_OF_ALPHABET;}break;caseDIGIT:/*数字字符*/{sign_start=DIGIT_START;sign_count=COUNT_OF_DIGIT;}break;default:{return-1;}}/*endofswitch*/sprintf(buff,"%c",(sign_start+counter));counter=(counter+1)%sign_count;lock_set(fd,F_WRLCK);/*上写锁*/if((size=write(fd,buff,strlen(buff)))<0){printf("Producer:writeerror\n");return-1;}lock_set(fd,F_UNLCK);/*解锁*/close(fd);return0;}intmain(intargc,char*argv[]){inttime_step=1;/*生产周期*/inttime_life=10;/*需要生产的资源数*/if(argc>1){/*第一种参数表达生产周期*/sscanf(argv[1],"%d",&time_step);}if(argc>2){/*第二个参数表达需要生产的资源数*/sscanf(argv[2],"%d",&time_life);}while(time_life--){if(product()<0){break;}sleep(time_step);}exit(EXIT_SUCCESS);}消费者程序的源代码:/**/#include<>#include<>#include<>#include<>#include<>#include""#defineMAX_FILE_SIZE 100*1024*1024/*100M*/constchar*fifo_file="./myfifo";/*仿真FIFO文献名*/constchar*tmp_file="./tmp"; /*临时文献名*//*资源消费函数customing*/intcustoming(constchar*myfifo,intneed){intfd;charbuff;intcounter=0;if((fd=open(myfifo,O_RDONLY))<0){printf("Functioncustomingerror\n");return-1;}printf("Enjoy:");lseek(fd,SEEK_SET,0);while(counter<need){while((read(fd,&buff,1)==1)&&(counter<need)){fputc(buff,stdout);/*-.就是在屏幕上/0的显示*/counter++;}}fputs("\n",stdout);close(fd);return0;}/*myfilecopy()函数:实现从sour_file文献的offset偏移处开始将count个字节数据复制到dest_file文献*/intmyfilecopy(constchar*sour_file,constchar*dest_file,intoffset,intcount,intcopy_mode){intin_file,out_file;intcounter=0;charbuff_unit;if((in_file=open(sour_file,O_RDONLY|O_NONBLOCK))<0){printf("Functionmyfilecopyerrorinsourcefile\n");return-1;}if((out_file=open(dest_file,O_CREAT|O_RDWR|O_TRUNC|O_NONBLOCK,0644))<0){printf("Functionmyfilecopyerrorindestinationfile:");return-1;}lseek(in_file,offset,SEEK_SET);while((read(in_file,&buff_unit,1)==1)&&(counter<count)){write(out_file,&buff_unit,1);counter++;}close(in_file);close(out_file);return0;}/*custom()函数:实现FIFO消费者*/intcustom(intneed){intfd;/*对资源进行消费,need表达该消费的资源数目*/customing(fifo_file,need);if((fd=open(fifo_file,O_RDWR))<0){printf("Functionmyfilecopyerrorinsource_file:");return-1;}/*为了模拟FIFO构造,对整个文献进平行行移动*/lock_set(fd,F_WRLCK);myfilecopy(fifo_file,tmp_file,need,MAX_FILE_SIZE,0);myfilecopy(tmp_file,fifo_file,0,MAX_FILE_SIZE,0);lock_set(fd,F_UNLCK);unlink(tmp_file);close(fd);return0;}intmain(intargc,char*argv[]){intcustomer_capacity=10;if(argc>1)/*第一种参数指定需要消费的资源数目,默认值为10*/{sscanf(argv[1],"%d",&customer_capacity);}if(customer_capacity>0){custom(customer_capacity);}exit(EXIT_SUCCESS);}(3)分别编译生产者程序和消费者程序(4)确保编译没有错误后,先在控制台终端1上运行生产者程序:./producer120再在控制台终端2上运行消费者程序:./customer54.完毕实验报告(1)将实验过程和实验成果截图(2)认真阅读程序代码,参考代码并根据实验成果,完毕实验总结。该程序运用文献模拟管道来传输数据,使用设立文献描述符的状态来实现文献上锁与解锁的功效,避免在读写同一文献由于同时操作产生错误,对比于操作系统的信号同时,其原理是同样的。5.附加实验作业:用write,read,open等系统调用编写分别实现以下功效的程序`(规定进行必要的出错检查):(1)创立一种文献,文献内容从键盘输入;(2)将的内容显示在屏幕上,并将的内容复制到一种新的文献中。#include<>#include<>#include<>#include<>#include<>constchar*fifo_file="./";intmain(){intfd;charbuffer[1024];if((fd=open(fifo_file,O_CREAT|O_RDWR|O_APPEND,0644))<0){printf("Openfifofileerror\n");exit(1);}printf("pleaseinputsomedata:");scanf("%s",buffer);write(fd,buffer,strlen(buffer));close(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论