Linux系统文件I/O编程(二) 文件锁函数

上一节:http://blog.csdn.net/mybelief321/article/details/8989755讲述的5个基本函数函数open()、 read()、write()、lseek()和close()实现的文件的打开、读/写等操作,本节将讨论在文件已经共享的情况下 如何操作,也就是当多个用户共同使用、操作一个文件的情况。这时,Linux通常采用的方法是给文件上锁, 来避免共享的资源产生竞争的状态。

文件锁包括建议性锁和强制性锁。建议性锁要求每个上锁文件的 进程检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁。强制性锁是由内 核执行的锁,当一个文件被上锁执行写入操作时,内核将阻止其他任何文件对其进行读写操作。采用强制性锁 对性能影响很大,每次读写都必须检查是否有锁存在。

在Linux中,实行文件上锁的函数有lockf()和 fcntl(),其中lockf()用于对文件施加建议性锁,而fcntl()不仅可以施加建议性锁,还可以施加强制性锁。 同时,fcntl()还能对文件的某一记录上锁,也就是记录锁。

记录锁又可分为读取锁和写入锁,其中 读取锁又称为共享锁,它能够使多个进程都能在文件的同一部分建立读取锁。而写入锁又称为排斥锁,在任何 时刻只能有一个进程在某个部分建立写入锁。当然,在文件的同一部分不能同时建立读取锁和写入锁。

fcntl()函数具有很丰富的功能,它可以对已打开的文件描述符进行各种操作,不仅包括管理文件锁 ,还包括获得设置文件描述符和文件描述符标志、文件描述符的复制等很多功能!这一次我先学习一下fcntl ()函数建立文件锁的方法,关于它的另外的用法...先学会了这个再说吧!

fcntl()函数格式

表1中的lock是一个flock结构体,结构如下:

上图中的 off_t 就是数据类 型 long int ;pid_t 就是数据类型  int,不懂这里有解释:点此解释

那么这个结构体lock中每个变量的取值含义如下表2

时间: 2024-10-02 16:41:20

Linux系统文件I/O编程(二) 文件锁函数的相关文章

Linux系统文件I/O编程(三) I/O多路复用

多路复用 函数说明 我们都知道fcntl()函数解决了文件共享的问题,如果不知道请看: http://blog.csdn.net/mybelief321/article/details/8993138.接下来该处理I/O复用的情况了.那么,什 么是I/O复用呢?这个咱得先弄清楚,所谓的I/O复用无非就是多个进程共同使用一个I/O输入输出流. 在经典的<Unix网络编程第1卷>Chapter 6中作者详细介绍了五种I/O模型,分别为: ① blocking I/O ② nonblocking I

Linux系统文件I/O编程(一) open()等基本函数

Linux文件I/O系统概述 虚拟文件系统(VFS) Linux系统成功的关键因素之一就是具有与其 他操作系统和谐共存的能力.Linux系统的文件系统由两层结构构建:第一层是虚拟文件系统(VFS),第二层 是各种不同的具体的文件系统. VFS就是把各种具体的文件系统的公共部分抽取出来,形成一个抽象层 ,是系统内核的一部分,它位于用户程序和具体的文件系统之间.它对用户提供了标准的文件系统调用接口, 对具体的文件系统(如EXT2.FAT32等),它通过一系列的对不同文件系统公用的函数指针来实际调用具

fork() 函数与 Linux 中的多线程编程

一.fork()函数 在操作系统的基本概念中进程是程序的一次执行,且是拥有资源的最小单位和调度单位(在引入线程的操作系统中,线程是最小的调度单位).在Linux系统中 创建进程有两种方式:一是由操作系统创建,二是由父进程创建进程(通常为子进程).系统调用函数fork()是创建一个新进程的唯一方式,当然 vfork()也可以创建进程,但是实际上其还是调用了fork()函数.fork()函数是Linux系统中一个比较特殊的函数,其一次调用会有两个返 回值,下面是fork()函数的声明: #inclu

浅谈Linux环境下并发编程中C语言fork()函数的使用_C 语言

由fork创建的新进程被称为子进程(child process).fork函数被调用一次,但返回两次.子进程的返回值是0,而父进程的返回值则是新进程的进程ID.将子进程ID返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得其所有子进程的进程ID.fork使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getpid以获得其父进程的进程ID. 使fork失败的两个主要原因是:系统中已经有了太多的进程,或者该实际用户ID的进程总数超过

Linux系统共享库编程

一.说明 类似Windows系统中的动态链接库,Linux中也有相应的共享库用以支持代码的复用.Windows中为*.dll,而Linux中为*.so.下面详细介绍如何创建.使用Linux的共享库. 二.创建共享库 在mytestso.c文件中,代码如下: #include <stdio.h> #include <stdlib.h> int GetMax(int a, int b) { if (a >= b) return a; return b; } int GetInt(

Linux下多进程/多线程编程

linux下多进程.多线程编程 linux下进程   (一) 理解Linux下进程的结构  Linux下一个进程在内存里有三部份的数据,就是"数据段","堆栈段"和"代码段",其实学过汇编语言的人一定知道,一般的CPU象I386,都有上述三种段寄存器,以方便操作系统的运行."代码段",顾名思义,就是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段.  堆栈段存放的就是子程序的返回地址

Linux GCC 64位编程技巧

                                 linux GCC 64位编程技巧 64位系统的优势? 既然要采用64位系统,首先要知道64位系统的优势所在.对于技术人员来说,完全没有必要去看那些厂家拿出的厚厚的说明书.或者某个研究机构抛出的一堆的数字,64位系统的优势总结起来很简单:内存大.速度快! 内存大 与32位系统相比,64位系统的地址空间大大增大,达到了18PB,18PB究竟是多大呢?说出来有点吓人:4G内存的40亿倍!这么大的空间,不要说内存了,就是整个磁盘的数据都

linux c ip报文 文件-linux IP报文 文件编程

问题描述 linux IP报文 文件编程 抓取IP报文,对其进行分析之后写入指定的文件中保存. linux里面使用c语言编程. 希望高手指点,给点相关资料,或者流程图什么的. 解决方案 参考:http://blog.csdn.net/zhb123168/article/details/6317095http://www.cnblogs.com/hcu5555/articles/2660295.html 解决方案二: http://blog.csdn.net/zhb123168/article/d

Linux下的多线程编程(三)_Linux

   下面先来一个实例.我们通过创建两个线程来实现对一个数的递加. 或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去拉. 下面是我们的代码: /*thread_example.c : c multiple thread programming in linux *author : falcon *E-mail : tunzhj03@st.lzu.edu.cn */ #include <pthread.h> #include <stdio.h> #inclu