实验5Linux文件操作之带缓存和非缓冲文件的读写

上传人:l**** 文档编号:134565189 上传时间:2020-06-06 格式:DOC 页数:11 大小:199.50KB
返回 下载 相关 举报
实验5Linux文件操作之带缓存和非缓冲文件的读写_第1页
第1页 / 共11页
实验5Linux文件操作之带缓存和非缓冲文件的读写_第2页
第2页 / 共11页
实验5Linux文件操作之带缓存和非缓冲文件的读写_第3页
第3页 / 共11页
实验5Linux文件操作之带缓存和非缓冲文件的读写_第4页
第4页 / 共11页
实验5Linux文件操作之带缓存和非缓冲文件的读写_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《实验5Linux文件操作之带缓存和非缓冲文件的读写》由会员分享,可在线阅读,更多相关《实验5Linux文件操作之带缓存和非缓冲文件的读写(11页珍藏版)》请在金锄头文库上搜索。

1、 实验5 Linux文件操作之带缓存和非缓冲文件的读写学生:王祥真 学号:6103114095 专业班级: 计科143 实验类型: 验证 综合 设计 创新 实验日期: 2017.4.20 实验成绩: 一实验目的通过编写文件读写及上锁的程序,进一步熟悉 Linux 中文件 I/O 相关的应用开发, 并且熟练掌握 open()、read()、write()、fcntl()等函数的使用。二实验容1. 用write, read, open等系统调用编写分别实现如下功能的程序(要求进行必要的出错检查):(1)创建一个文件testfile.txt,文件容从键盘输入;(2)将testfile.txt的容显示

2、在屏幕上,并将testfile.txt的容复制到一个新的文件file2.txt中。实验代码:#include#include#include#include#include#include#include#includeint main() int fd, fdsrc,fddes,nbytes; int newret ,n1,n2; int flags=O_CREAT | O_TRUNC | O_WRONLY; char src50,des30,buf30; char str160; char str260; strcat(str1,cat ); printf(请输入要创建的源文件名字); s

3、canf(%s,src); fd=creat(src,S_IRUSR|S_IWUSR); /创建源文件 n1=read(STDIN_FILENO,buf,80); if(n10) perror(read STDIN_FILENO); exit(1); fdsrc=open(src,flags,0644); /以读写方式打开 if(fdsrc0) exit(1); write(fdsrc,buf,n1);/写入 printf(输出刚创建源文件的容n); strcat(str1,src);/cat src; newret=system(str1);/执行命令 close(fdsrc);/ 关闭指针

4、 printf(请输入目标文件名: ); scanf(%s,des); fd=creat(des,S_IRUSR|S_IWUSR); fdsrc=open(src,O_RDONLY); if(fdsrc0) exit(1); fddes=open(des,flags,0744); if(fddes0) int z=write(fddes,buf,nbytes); if(z0) perror(写文件出错); close(fdsrc); close(fddes); printf(复制%s文件到%s文件成功!n,src,des); return 0;实验结果:2. 在 Linux 中 FIFO 是一

5、种进程之间的管道通信机制。Linux 支持完整的 FIFO通信 机制。 本实验容,通过使用文件操作,仿真 FIFO(先进先出)结构以及生产者-消费者运行模型。 本实验中需要打开两个虚拟终端,分别运行生产者程序(producer)和消费者程序(customer)。此时两个进程同时对同一个文件进行读写操作。因为这个文件是临界资源,所以可以使用文件锁机制来保证两个进程对文件的访问都是原子操作。 先启动生产者进程,它负责创建仿真 FIFO 结构的文件(其实是一个普通文件)并投入生产,就是按照给定的时间间隔,向 FIFO 文件写入自动生成的字符(在程序中用宏定义选择使用数字还是使用英文字符),生产周期以

6、及要生产的资源数通过参数传递给进程(默认生产周期为 1s,要生产的资源数为 10 个字符)。 后启动的消费者进程按照给定的数目进行消费,首先从文件中读取相应数目的字符并在屏幕上显示,然后从文件中删除刚才消费过的数据。为了仿真 FIFO 结构,此时需要使用两次复制来实现文件容的偏移。每次消费的资源数通过参数传递给进程,默认值为10 个字符。 三实验环境PC微机Windows 操作系统、虚拟机、Linux操作系统四实验步骤 1. 编写代码实现要求的功能;2. 本实验问验证实验,但其中用到的文件操作函数和重要的文件锁操作:1)实验流程图 本实验的两个程序的流程图如图: 开始开始(producer)(

7、customer)消费资源 创建FIFO结构文件(打印字符)否消费够了吗?生产一个资源是上锁上锁将剩下的数据拷贝到等待临时文件tmp中一秒将“生产”的字符写入到FIFO结构文件用临时文件tmp覆盖原数据文件,这样模拟FIFO结构解锁解锁 生产完了吗? 删除临时文件结束结束图 6.4 节流程图(2)代码 头部文件代码: mylock.hstruct myflock short l_type; /*文件锁类型: F_RDLOCK 读取锁;F_WRLCK 写入锁;F_UNLCK 解锁 */ off_t l_start; /*相对位移量*/ short l_whence; /*相对位移量的起点SEEK

8、_SET;SEEK_CUR; SEEK_END: */ off_t l_len; /* 加锁区域长度 */ pid_t l_pid; /* */ ;/* lock_set */ int lock_set(int fd, int type) struct myflock old_lock, lock; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_type = type; lock.l_pid = -1; /* 判断文件是否可以上锁 */ fcntl(fd, F_GETLK, &lock); if (lock

9、.l_type != F_UNLCK) /* 判断文件不能上锁的原因 */ if (lock.l_type = F_RDLCK) /* 该文件已有读取锁 */ printf(Read lock already set by %dn, lock.l_pid); else if (lock.l_type = F_WRLCK) /* 该文件已有写入锁 */ printf(Write lock already set by %dn, lock.l_pid); /* l_type 可能已被 F_GETLK 修改过 */ lock.l_type = type; /* 根据不同的 type 值进行阻塞式上锁

10、或解锁 */ if (fcntl(fd, F_SETLKW, &lock) 0) printf(Lock failed:type = %dn, lock.l_type); return 1; switch(lock.l_type) case F_RDLCK: printf(Read lock set by %dn, getpid(); break; case F_WRLCK: printf(Write lock set by %dn, getpid(); break; case F_UNLCK: printf(Release lock by %dn, getpid(); return 1; b

11、reak; default: break; /* end of switch*/ return 0;生产者程序的源代码: producer.c/* producer.c */ #include #include #include #include #include #include mylock.h #define MAXLEN 10 /* 缓冲区大小最大值*/#define ALPHABET1 /* 表示使用英文字符 */#define ALPHABET_START a /* 头一个字符,可以用 A*/ #define COUNT_OF_ALPHABET 26 /* 字母字符的个数 */#d

12、efine DIGIT 2 /* 表示使用数字字符 */#define DIGIT_START 0 /* 头一个数字字符 */#define COUNT_OF_DIGIT 10 /* 数字字符的个数 */#define SIGN_TYPE ALPHABET/* 本实例用英文字符 */const char *fifo_file = ./myfifo;/* ! FIFO 文件名 */char buffMAXLEN;/* 缓冲区 */* 函数product() 产生一个字符并写入仿真 FIFO 文件中 */ int roduct(void) int fd; unsigned int sign_type, sign_start, sign_count, size; static unsigned int counter

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作范文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号