锁定中的几个概念
文件锁定的是整个文件,而记录锁定只锁定文件的某一特定部分。UNIX 的记录指的是从文件的某一相对位置开始的一段连续的字节流,它不同于其它以强制性记录结构阻止文件的操作系统,因此,UNIX 记录锁更恰当的称呼应该是范围锁,它是对文件某个范围的锁定。
文件和记录锁定可分为咨询式锁定和强制锁定两种。当正在运行的某一进程对它将要访问的某一文件进行了咨询式锁定后,其它想要访问该文件的进程将被操作系统告知共享文件已经上了锁,但这并不阻止它们对锁定文件的操作。只要有对锁定文件的存取权,这些进程便可忽视咨询式锁定而去写上了锁的文件。强制锁定的含义则要严格多了,当某一共享文件被强制后,操作系统将会对每个读写文件的请求进行核查,只有在确证该请求不会干扰上了锁的文件时,才允许对应的操作。System V和 BSD 都提供了咨询式锁定方式。这两种锁定方式都被Linux 支持。
System V的咨询锁定
System V的锁函数 lockf()具有如下的形式:
#include <unistd.h>
int lockf(int fd, int function, long size);
参数 fd 是在文件打开操作中获得的文件描述符;
参数 function 可以取如下的参数值:
F_ULOCK 为一个先前锁定的区域解锁
F_LOCK 锁定一个区域
F_TLOCK 测试并锁定一个区域
F_TEST 测试一个区域是否已经上锁。
参数 size 指明了从文件当前位置开始的一段连续锁定区域的长度,当 size 为 0 时,锁定记录将由当前位置一直扩展到文件尾。
函数 lockf()既可以用来上锁有可以用来测试是否已经赏了锁。 如果 lockf 的参数function为 F_LOCK 指定文件的对应区域已被其它进程锁定,那么 lockf 的调用进程将被阻塞直到该区域解锁。上述情况我们称为阻塞。如果在调用 lockf()时把参数设为 F_TLOVK,那么当被测试的区域上了锁时,lockf 便会立即返回-1,出错返回码 errno 将为 EAGAIN,它是一个非阻塞调用。
#include <unistd.h>
my_lock(int fd)
{
/* 将文件指针移回文件头 */
lseek(fd,0L,0);
/* 锁定整个文件 */
if (lockf(fd,F_LOCK,0L)==-1)
{
perror("can't F_LOCK");
exit(1);
}
}
my_unlock(int fd)
{
lseek(fd,0L,0);
if(lockf(fd,F_ULOCK,0L)==-1)
{
perror("can't F_UNLOCK");
exit(1);
}
}
BSD的咨询式锁定
BSD UNIX 操作系统提供了如下形式的调用来锁定和解锁一个文件:
#include <sys/file.h>
int flock(int fd, int operation);
调用 flock有两个参数:
参数 fd 是一个已打开文件的文件描述符;
参数 operation 可设定为下述各值:
LOCK_SH 共享锁
LOCK_EX 互斥锁
LOCK_UN 解锁
LOCK_NB 当文件已被锁定时不阻塞
BSD UNIX使用flock()来请求对指定文件的咨询式锁定和解锁。BSD的咨询锁有共享锁和互斥锁两种。在任一给定时刻,多个进程可以用于属于同一文件的共享锁,但是某共享文件不能同时具有多个互斥锁或存在共享锁和互斥锁共存的情况。如果锁定成功,flock将返回零,否则返回-1。
#include <sys/file.h>
my_flock(int fd)
{
if (flock(fd,LOCK_EX))==-1)
{
perror(“ can LOCK_EX” );
exit(1);
}
}
my_unload(fd)
{
if (flock(fd,LOCK_UN)==-1)
{
perror(“ can’ t LOCK_UN” );
exit(1);
}
}
前面两种锁定方式的比较
由于 Linux 支持上面的两种锁定方式,所以可以根据不同的实际情况选用不同的锁定方式。以上的两种锁定方式有以下的不同:
1.System V的锁定方式是记录锁定,可以指定锁定的范围。而 BSD 的锁定方式是文件锁定,只能指定锁定文件。
2.System V的锁定是每个进程所独有的,可以用于父子进程间的共享锁定。而 BSD的锁定方式是可以继承的,父子进程间使用的是同一锁定的,所以不能用于父子进程间的文件共享锁定
分享到:
相关推荐
《Linux/Unix系统编程手册》是一本深受程序员和系统管理员喜爱的经典著作,它详细阐述了在Linux和Unix操作系统上进行低级编程的各种技术。附录中的代码是书中的实例,旨在帮助读者深入理解和掌握这些系统编程的核心...
《Linux/Unix 系统编程手册》是一本深入探讨Linux和Unix系统编程的权威著作,由德国专家Michael Kerrisk撰写,并由孙剑等翻译成中文,由人民邮电出版社出版。这本书涵盖了广泛的系统编程主题,旨在帮助开发者理解和...
《Linux/UNIX系统编程手册》是一本深受程序员和系统管理员喜爱的经典著作,它详细阐述了在Linux和UNIX操作系统上进行系统级编程的各种技术。源码是书籍内容的实践部分,对于学习和理解书中的概念至关重要。这个...
在IT领域,Linux/Unix操作系统提供了丰富的编程接口,使得开发者能够构建高效且可靠的软件系统。在本主题中,我们将深入探讨“归档_Linux/Unix编程”中的关键知识点,特别是进程间通信(IPC,Inter-Process ...
《UNIX环境高级编程》是一本深入探讨Linux/Unix系统编程的经典著作,对于任何希望在这些操作系统上进行系统级编程的开发者来说,都是不可或缺的参考书。这本书详细介绍了如何利用UNIX/Linux系统的API和工具来构建...
《Linux/Unix系统编程手册》是一本权威的指南,涵盖了操作系统的核心编程概念和技术。这本书的官方参考源码提供了丰富的示例程序,帮助读者深入理解书中的理论内容,并将其转化为实践。源码的可用性经过验证,确保了...
《疱丁解牛Linux内核分析》是由孟宁编著的一本深入解析Linux内核的专著,旨在帮助读者逐步掌握Linux操作系统的精髓,提升在Linux/Unix编程领域的专业技能。这本书出版于2018年10月,是自学者理解和掌握操作系统核心...
标题中的"main.tar_control_Linux/Unix编程_"表明这是一个与Linux/Unix系统编程相关的压缩文件,其中可能包含了一个名为"main.c"的源代码文件,用于实现某种控制功能,可能是设备驱动或者系统级别的GPIO(General-...
在Linux和Unix操作系统中,TTY(Teletype)是一种历史悠久的终端设备,它在现代已经演变为对控制台和各种类型的文本终端的抽象。TTY驱动程序是操作系统内核的一部分,负责处理与这些设备的交互。本教程将深入探讨TTY...
在本项目中,我们关注的是一个基于Linux/Unix操作系统、使用C语言编写的聊天程序。这个聊天程序的设计和实现展示了C语言在系统级编程中的应用,以及如何利用多线程和双进程技术来构建可靠的通信系统。以下是这个聊天...
《Linux/Unix系统编程手册》是一本权威且深入的书籍,涵盖了Linux和Unix操作系统的系统级编程技术。这本书的源代码提供了实践操作的实例,帮助读者深入理解如何在这些系统中编写高效的程序。源代码的获取是直接从...
在IT领域,Linux/Unix操作系统和Visual C++是两个截然不同的但又相互关联的知识点。Linux/Unix作为开源的操作系统,广泛应用于服务器、嵌入式设备和开发环境,而Visual C++是Microsoft公司推出的一款强大的C++集成...
《ARM Cortex-M3权威指南》是深入理解和应用基于ARM Cortex-M3微控制器的重要参考资料,尤其对于在Linux/Unix环境中进行嵌入式系统开发的工程师来说,具有极高的实用价值。ARM Cortex-M3是一款高效能、低功耗的32位...
《Linux/Unix系统编程手册》是一本权威的书籍,涵盖了操作系统接口、进程管理、文件操作、网络编程等众多核心主题。书中的代码示例旨在帮助读者深入理解这些概念,并能够实际应用到自己的程序中。以下将对这些关键...
标题中的"operation.rar_Linux/Unix编程_Unix_Linux_"暗示了我们讨论的是与Linux/Unix操作系统相关的编程技术,特别是涉及到操作管理的方面。描述中提到的"omap_hwmod_2430_data.c"是一个源代码文件,它专注于FS-...
《理解Unix/Linux编程》这本书是Unix/Linux编程领域的经典之作,旨在帮助读者深入理解这两个操作系统的核心原理和编程技术。书中的内容不仅涵盖了基础的系统调用、文件操作,还包括进程管理、网络编程等高级主题,是...
在IT领域,Linux和Unix操作系统是开发者和系统管理员的重要工具,尤其对于C语言编程来说,它们提供了丰富的底层接口和强大的性能优化能力。本资源“linux_c.rar”专注于Linux/Unix平台上的C语言编程,旨在为初学者...
7. **多线程与并发**:在现代计算中,多线程和并发是常见的,理解如何在Linux/Unix环境下创建和管理线程,以及同步机制(如互斥锁、信号量)是必要的。 8. **错误处理**:良好的错误处理是稳健编程的关键。在Linux/...
《Linux-UNIX系统编程手册中文版》是一本深入讲解Linux和UNIX系统编程的权威指南,其特点是内容详尽且组织清晰。这本书对于那些希望深入了解操作系统内部工作原理、掌握系统编程技术的开发者来说,无疑是一份宝贵的...
Linux提供了信号量、互斥锁、条件变量等多种同步原语。在"me4000.c"中,我们可以学习如何使用这些原语确保数据一致性,防止竞争条件和死锁的发生。 六、设备模型 Linux内核设备模型为设备驱动提供统一的抽象层,...