实验4文件操作浅析.docxVIP

  • 11
  • 0
  • 约9.15千字
  • 约 14页
  • 2017-04-23 发布于湖北
  • 举报
实验4、文件操作 学生姓名: 李亚军 学 号: 6100412196 专业班级: 卓越计科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结构 解锁 解锁 生产完了吗? 删除临时文件 结束 结束 图 6.4 节流程图 (2)代码 头部文件代码:mylock.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, lock)) 0) { printf(Lock failed:type = %d\n, lock.l_type); return 1;

文档评论(0)

1亿VIP精品文档

相关文档