实验4---文件操作.docx

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验4 文件操作 学生姓名: 邓军 学号:6103113075 专业班级: 计算机科学与技术132班 实验类型:□ 验证 □ 综合 ? 设计 □ 创新 实验日期: 2016.3.22 实验成绩: 实验目的 通过编写文件读写及上锁的程序,进一步熟悉 Linux 中文件 I/O 相关的应用开发,并 并且熟练掌握 open()、read()、write()、fcntl()等函数的使用。 实验内容 在 Linux 中 FIFO 是一种进程之间的管道通信机制。Linux 支持完整的 FIFO通信 机制。 本实验内容,通过使用文件操作,仿真 FIFO(先进先出)结构以及生产者-消费者运行模型。 本实验中需要打开两个虚拟终端,分别运行生产者程序(producer)和消费者程序(customer)。此时两个进程同时对同一个文件进行读写操作。因为这个文件是临界资源,所以可以使用文件锁机制来保证两个进程对文件的访问都是原子操作。 先启动生产者进程,它负责创建仿真 FIFO 结构的文件(其实是一个普通文件)并投入生产,就是按照给定的时间间隔,向 FIFO 文件写入自动生成的字符(在程序中用宏定义选择使用数字还是使用英文字符),生产周期以及要生产的资源数通过参数传递给进程(默认生产周期为 1s,要生产的资源数为 10 个字符)。 后启动的消费者进程按照给定的数目进行消费,首先从文件中读取相应数目的字符并在屏幕上显示,然后从文件中删除刚才消费过的数据。为了仿真 FIFO 结构,此时需要使用两次复制来实现文件内容的偏移。每次消费的资源数通过参数传递给进程,默认值为10 个字符。 实验步骤 (1)、实验流程图 本实验的两个程序的流程图如图: 开始 开始 (producer) (customer) 消费资源 创建FIFO结构文件 (打印字符) 消费够了吗? 生产一个资源 上锁 上锁 将剩下的数据拷贝到 等待 临时文件tmp中 一秒 将“生产”的字符 写入到FIFO结构文件 用临时文件tmp覆盖 原数据文件,这样 模拟FIFO结构 解锁 解锁 生产完了吗? 删除临时文件 结束 结束 图 6.4 节流程图 (2)代码 头部文件代码:mylock.h #includesys/stat.h #includeunistd.h #includefcntl.h struct myflock { short l_type; /*文件锁类型: F_RDLOCK 读取锁;F_WRLCK 写入锁;F_UNLCK 解锁 */ off_t l_start; /*相对位移量*/ short l_whence; /*相对位移量的起点SEEK_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.l_type != F_UNLCK) { /* 判断文件不能上锁的原因 */ if (lock.l_type == F_RDLCK) /* 该文件已有读取锁 */ { printf(Read lock already set by %d\n, lock.l_pid); } else if (lock.l_type == F_WRLCK) /* 该文件已有写入锁 */ { printf(Write lock already set by %d\n, lock.l_pid); } } /* l_type 可能已被 F_GETLK 修改过 */ lock.l_type = type; /* 根据不同的 type 值进行阻塞式上锁或解锁 */ if ((fcntl(fd, F_SETLKW, loc

文档评论(0)

ctuorn0371 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档