- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
嵌入式操作系统0772
§7.2 文件I/O 九、 fcntl函数 1、fcntl函数有五种功能: 获得/设置异步I / O所有权(cmd = F_GETOWN或F_SETOWN)。 F_GETOWN 取当前接收SIGIO和SIGURG信号的进程ID或进程组ID。 F_SETOWN 设置接收SIGIO和SIGURG信号的进程ID或进程组ID。正的arg指定一个进程ID,负的arg表示等于arg绝对值的一个进程组ID。 获得/设置记录锁(cmd = F_SETLK , F_SETLKW)。 §7.2 文件I/O 九、 fcntl函数 2、文件状态说明: §7.2 文件I/O 九、 fcntl函数 3、用fcntl给文件加锁 当多个用户共同使用、操作一个文件的时候,linux通常采用的方法是给文件上锁,来避免共享资源产生竞争的状态。 文件锁包括建议锁和强制性锁。 建议性锁要求上锁文件的进程都要检测是否有锁存在,并尊重已有的锁。 强制性锁由内核和系统执行的锁。 fcntl不仅可以实施建议性锁而且可以实施强制性锁。 §7.2 文件I/O 九、 fcntl函数 4、fcntl函数格式 #include sys/types.h #include unistd.h #include fcnt1.h int fcnt1(int filedes, int cmd,... struct flock flockptr ) ; L_whence:设置你需要的查询位置 §7.2 文件I/O 九、 fcntl函数 5、 flock结构说明 所希望的锁类型:F_RDLCK(共享读锁)、F_WRLCK(独占性写锁)或F_UNLCK(解锁一个区域) 要加锁或解锁的区域的起始地址,由l_start和l_whence两者决定。l_stat是相对位移量(字节),l_whence则决定了相对位移量的起点。 区域的长度,由l_len表示。 §7.2 文件I/O 九、 fcntl函数 5、 flock结构说明 关于加锁和解锁区域的注意事项: 该区域可以在当前文件尾端处开始或越过其尾端处开始,但是不能在文件起始位置之前开始或越过该起始位置。 如若l_len为0,则表示锁的区域从其起点(由l_start和l_whence决定)开始直至最大可能位置为止。也就是不管添写到该文件中多少数据,它都处于锁的范围 为了锁整个文件,通常的方法是将l_start说明为0,l_whence说明为SEEK_SET,l_len说明为0。 §7.2 文件I/O 文件I/O举例7-3: /* lock_set函数 */ #include unistd.h #include sys/types.h #include sys/stat.h #include stdio.h #include stdlib.h #include fcntl.h ? void lock_set(int fd, int type) { struct flock lock; lock.l_whence=SEEK_SET; //赋值lock结构体,表示对整个文件加锁 lock.l_start=0; lock.l_len=0; while(1) { lock.l_type=type; //根据不同的type值给文件上锁或解锁 if ((fcntl(fd, F_SETLK, lock))==0) //将文件标志设置为第三个参数的值 { if (lock.l_type==F_RDLCK) //如果文件已经设置成共享读锁 printf(Read lock set by %d\n,getpid()); §7.2 文件I/O 文件I/O举例7-3: else if (lock.l_type==F_WRLCK) //如果文件已经设置成独占性写锁 printf(Write lock set by %d\n,getpid()); else if (lock.l_type==F_UNLCK) //如果文件要求进行解锁 printf(Release lock by %d\n,getpid()); return; } /*判断文件是否可以上锁*/ fcntl(fd, F_GETLK, lock); /*判断文件不能上锁的原因*/ if (lock.l_type!=F_UNLCK) { if (lock.l_type==F_RDLCK) //该文件已有写入锁 printf(Read lock already set by %d\
您可能关注的文档
最近下载
- 建筑工程图集 19DX101-1:建筑电气常用数据.pdf VIP
- 六年级上册语文一课一练-11故宫博物院含答案.pdf VIP
- 小学体育水平一《爬越一定高度的高障碍物》教学设计.doc VIP
- 迈迪工具箱-齿轮设计教程(详细).pptx
- 2025-2026学年湘美版四年级上册书法全册教学教案(教学设计).pdf VIP
- 第二章 课程与教学研究的历史发展.ppt VIP
- 2024年3月青少年机器人技术等级考试理论综合试卷二级真题及答案.docx VIP
- 2024浙江杭州市能源集团有限公司招聘6人笔试参考题库附带答案详解.pdf
- 《传统木工工具》精美课件.pptx VIP
- 面粉厂事故应急救援预案.docx VIP
文档评论(0)