网站大量收购闲置独家精品文档,联系QQ:2885784924

fcntl和select函数彻底搞明白.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
fcntl和select函数彻底搞明白第一、fcntl函数详细使用?????? fcntl有强大的功能,它能够复制一个现有的描述符,获得/设置文件描述符标记,获得/设置文件状态标记,获得/设置异步I/O所有权,获得/设置纪录锁。 当多个用户共同使用,操作一个文件的情况,Linux通常采用的方法就是给文件上锁,来避免共享资源产生竞争的状态。 fcntl文件锁有两种类型:建议性锁和强制性锁 ???????? 建议性锁是这样规定的:每个使用上锁文件的进程都要检查是否有锁存在,当然还得尊重已有的锁。内核和系统总体上都坚持不使用建议性锁,它们依靠程序员遵守这个规定。 ???????? 强制性锁是由内核执行的。当文件被上锁来进行写入操作时,在锁定该文件的进程释放该锁之前,内核会阻止任何对该文件的读或写访问,每次读或写访问都得检查锁是否存在。 ???????? 使用fcntl文件锁进行I/O操作必须小心:进程在开始任何I/O操作前如何去处理锁,在对文件解锁前如何完成所有的操作,是必须考虑的。如果在设置锁之前打开文件,或者读取该锁之后关闭文件,另一个进程就可能在上锁/解锁操作和打开/关闭操作之间的几分之一秒内访问该文件。当一个进程对文件加锁后,无论它是否释放所加的锁,只要文件关闭,内核都会自动释放加在文件上的建议性锁(这也是建议性锁和强制性锁的最大区别), 所以不要想设置建议性锁来达到永久不让别的进程访问文件的目的(强制性锁才可以)^_^;强制性锁则对所有进程起作用。 ?????? 可以用fcntl 函数改变一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞等标志(这些标志称为File StatusFlag),而不必重新open 文件。 ????? #include unistd.h ????? #include fcntl.h ????? int fcntl(int fd, int cmd); ????? int fcntl(int fd, int cmd, long arg); ????? int fcntl(int fd, int cmd, struct flock *lock); 这个函数和open 一样,也是用可变参数实现的,可变参数的类型和个数取决于前面的cmd 参数。 文件锁包括了 建议性锁 和 强制性锁。 建议性锁要求每个上锁的文件的进程都要检查是否有锁存在,并且尊重已有的锁,在一般情况下,内核和系统都不使用建议性锁。 强制性锁是由内核执行的锁,当一个文件被上锁进行读写操作的时候,内核将阻止其他任何文件对其进行读写操作。每次读写操作都要检查是否有锁存在。 在Linux中实现上锁的函数有lock()和fcntl()。 lock()用于对文件施加建议性锁 fcntl()用于对文件施加建议性锁和强制性锁都行。同时还可以对文件某一条纪录进行上锁,也就是记录锁。 记录锁分为 读取锁(共享锁,它能够使多个进程都能在文件的同一部分建立读取锁) 和 写入锁(排斥锁,在任何时刻只能有一个进程在文件的某部分建立写入锁。)。 fcntl函数原型 #includesys/types.h #includeunistd.h #includefcntl.h int fcntl(int fd,?? //文件描述符 ????????? int cmd , //不同的命令 ????????? struct flock *lock) //设置记录锁的具体状态 cmd取值: F_DUPFD?? 复制文件描述符 F_GETFD?? 获得fd的close-on-exec标志 F_SETFD?? 设置close-on-exec标志 F_GETFL?? 获得open设置标志 F_SETFL?? 设置lock描述的标志 F_GETLK?? 测试该锁是否被另外一把锁排斥 F_SETLKW 如果存在其他锁,则调用进程睡眠,如果捕捉到信号则睡眠中断 F_GETOWN 检索收到的SIGIO和SIGURG信号的进程号或者进程组号 F_SETOWN 设置进程号或进程组号 这里的lock结构体如下: struct flock { ??? short l_type;?? /*F_RDLCK(读取锁),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; } 成功:0 出错:-1 提示:如果加锁整个文件通常的方法是将l_star

文档评论(0)

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

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

1亿VIP精品文档

相关文档