文件的读写与上锁.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
— PAGE PAGE 4 欢迎下载 1. 实验目的 通过编写文件读写及上锁的程序,进一步熟悉Linux中文件I/O相关的应用开发,并且熟练掌握open()、read()、write()、fcntl()等函数的使用。 2. 实验内容 在Linux中FIFO(先进先出)是一种进程间的管道通信机制。本实验通过使用文件操作,仿真FIFO结构以及生产者-消费者运行模型。 3. 实验步骤 (1)流程图 该实验流程图如图所示 (2)程序说明 本实验需要打开两个虚拟终端,分别运行生产者程序(producer)和消费者程序(customer)。此时两个进程同时对同一个文件进行读写操作。因为这个文件是临界资源,所以可以使用文件锁机制保证两个进程对文件的访问都是原子操作。 先启动生产者进程,它负责创建仿真FIFO结构文件(实际是一个普通文件)并投入生产,就是按照给定的时间间隔,向FIFO文件写入自动生成的字符(在程序中用宏定义选择使用数字还是使用英文字符),生产周期以及要生产的资源数通过参数传递给进程(默认生产周期1S,要生产的资源数为10个字符)。 后启动的消费者进程按照给定的数目进行消费,首先从文件中读取相应数目的字符并在屏幕显示,然后从文件中删除刚才消费过的数据。为了仿真FIFO结构,此时需要使用两次复制来实现文件内容的偏移。每次消费的资源数通过参数传递给进程,默认值为10个字符。 (3)代码 /* lock_set.c */ int lock_set(int fd, int type) { struct flock 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; } switch(lock.l_type) { case F_RDLCK: { printf(Read lock set by %d\n, getpid()); } break; case F_WRLCK: { printf(Write lock set by %d\n, getpid()); } break; case F_UNLCK: { printf(Release lock by %d\n, getpid()); return 1; } break; default: break; }/* end of switch */ return 0; } 本实验中的生产者程序的源代码如下所示,其中用到的lock_set()函数。 /* producer.c */ #include stdio.h #include unistd.h #include stdlib.h #include string.h #include fcntl.h #include mylock.h #define MAXLEN 10 /* 缓冲区大小最大值*/ #define ALPHABET 1 /* 表示使用英文字符 */ #define ALPHABET_START a /* 头一个字符,可以用 A*/ #define COUNT_OF_ALPHABET 26 /* 字母字符的个数 */ #define DIGIT 2 /* 表示使用数字字符 */ #define DIGIT_START 0 /* 头一个字符 */ #define COUNT_OF_DIGIT 10 /* 数字字符的个数 */ #define SIGN_TYPE ALPHABET /* 本实例选用英文字符 */ const char *

文档评论(0)

Nina_666 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档