资源描述:
《fcntl和select函数彻底搞明白》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、fcntl和select函数彻底搞明白第一、fcntl函数详细使用 fcntl有强大的功能,它能够复制一个现有的描述符,获得/设置文件描述符标记,获得/设置文件状态标记,获得/设置异步I/O所有权,获得/设置纪录锁。当多个用户共同使用,操作一个文件的情况,Linux通常采用的方法就是给文件上锁,来避免共享资源产生竞争的状态。fcntl文件锁有两种类型:建议性锁和强制性锁 建议性锁是这样规定的:每个使用上锁文件的进程都要检查是否有锁存在,当然还得尊重已有的锁。内核和系统总体上都坚持不使用建议性锁,它们依靠程序员遵守这个规定。
2、 强制性锁是由内核执行的。当文件被上锁来进行写入操作时,在锁定该文件的进程释放该锁之前,内核会阻止任何对该文件的读或写访问,每次读或写访问都得检查锁是否存在。 使用fcntl文件锁进行I/O操作必须小心:进程在开始任何I/O操作前如何去处理锁,在对文件解锁前如何完成所有的操作,是必须考虑的。如果在设置锁之前打开文件,或者读取该锁之后关闭文件,另一个进程就可能在上锁/解锁操作和打开/关闭操作之间的几分之一秒内访问该文件。当一个进程对文件加锁后,无论它是否释放所加的锁,只要文件关闭,内核都会自动释放加在文件上的建议性锁(这也是建议性锁和强
3、制性锁的最大区别),所以不要想设置建议性锁来达到永久不让别的进程访问文件的目的(强制性锁才可以)^_^;强制性锁则对所有进程起作用。 可以用fcntl函数改变一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞等标志(这些标志称为FileStatusFlag),而不必重新open文件。 #include #include intfcntl(intfd,intcmd); intfcntl(intfd,intcmd,longarg); intfcntl(intfd,i
4、ntcmd,structflock*lock);这个函数和open一样,也是用可变参数实现的,可变参数的类型和个数取决于前面的cmd参数。文件锁包括了建议性锁和强制性锁。建议性锁要求每个上锁的文件的进程都要检查是否有锁存在,并且尊重已有的锁,在一般情况下,内核和系统都不使用建议性锁。强制性锁是由内核执行的锁,当一个文件被上锁进行读写操作的时候,内核将阻止其他任何文件对其进行读写操作。每次读写操作都要检查是否有锁存在。otherstaffoftheCentre.Duringthewar,ZhuwastransferredbacktoJiangxi,andD
5、irectorofthenewOfficeinJingdezhen,JiangxiCommitteeSecretary.Startingin1939servedasrecorderoftheWestNorthOrganization,SecretaryoftheSpecialCommitteeAfterthevictoryofthelongMarch,hehasbeentheNorthwestOfficeoftheFederationofStateenterprisesMinister,ShenmufuguSARmissions,DirectorofNi
6、ngxiaCountypartyCommitteeSecretaryandrecorderoftheCountypartyCommitteeSecretary,Ministersand在Linux中实现上锁的函数有lock()和fcntl()。lock()用于对文件施加建议性锁fcntl()用于对文件施加建议性锁和强制性锁都行。同时还可以对文件某一条纪录进行上锁,也就是记录锁。记录锁分为读取锁(共享锁,它能够使多个进程都能在文件的同一部分建立读取锁)和写入锁(排斥锁,在任何时刻只能有一个进程在文件的某部分建立写入锁。)。fcntl函数原型#include
7、#include#includeintfcntl(intfd, //文件描述符 intcmd,//不同的命令 structflock*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
8、如果存在其他锁,则调用进程睡眠,如果捕捉到信号则睡眠中断F_GETOWN检索收到