linux下C语言中的flock函数用法

表头文件  #include<sys/file.h>

  定义函数  int flock(int fd,int operation);

  函数说明  flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。

  参数  operation有下列四种情况:

  LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。

  LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。

  LOCK_UN 解除文件锁定状态。

  LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。

  单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。

  返回值  返回0表示成功,若有错误则返回-1,错误代码存于errno。

 

flock只要在打开文件后,需要对文件读写之前flock一下就可以了,用完之后再flock一下,前面加锁,后面解锁。其实确实是这么简单,但是前段时间用的时候发现点问题,问题描述如下:

一个进程去打开文件,输入一个整数,然后上一把写锁(LOCK_EX),再输入一个整数将解锁(LOCK_UN),另一个进程打开同样一个文件,直接向文件中写数据,发现锁不起作用,能正常写入(我此时用的是超级用户)。google了一大圈发现flock不提供锁检查,也就是说在用flock之前需要用户自己去检查一下是否已经上了锁,说明白点就是读写文件之前用一下flock检查一下文件有没有上锁,如果上锁了flock将会阻塞在那里(An attempt to lock the file using one of these file descriptors may be denied by a lock that the calling process has already placed via another descriptor ),除非用了LOCK_NB。一个完整的用于测试的事例代码如下所示:

//lockfile.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

int main()
{
    int fd,i;
    char path[]="/home/taoyong/test.txt";
    extern int errno;
    fd=open(path,O_WRONLY|O_CREAT);
    if(fd!=-1)
        {
        printf("open file %s ./n",path);
        printf("please input a number to lock the file./n");
        scanf("%d",&i);
        if(flock(fd,LOCK_EX)==0)
            {
            printf("the file was locked./n");
            }
        else
            {
            printf("the file was not locked./n");
            }
        printf("please input a number to unlock the file./n");
        scanf("%d",&i);
        if(flock(fd,LOCK_UN)==0)
            {
            printf("the file was unlocked./n");
            }
        else
            {
            printf("the file was not unlocked./n");
            }
        close(fd);

        }
    else
        {
        printf("cannot open file %s/n",path);
        printf("errno:%d/n",errno);
        printf("errMsg:%s",strerror(errno));
        }
}

 

//testprocess.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/file.h>

int main()
{
    int fd,i;
    char path[]="/home/taoyong/test.txt";
    char s[]="writing.../nwriting....../n";
    extern int errno;
    fd=open(path,O_WRONLY|O_CREAT|O_APPEND);
    if(fd!=-1)
            {
        printf("open file %s ./n",path);

            if(flock(fd,LOCK_EX|LOCK_NB)==0)
            {
            printf("the file was locked by the process./n");    
                if(-1!=write(fd,s,sizeof(s)))
                    {
                printf("write %s to the file %s/n",s,path);
                        }
                else
                       {
                printf("cannot write the file %s/n",path);
                printf("errno:%d/n",errno);
                printf("errMsg:%s/n",strerror(errno));
                    }        
                
            }
        else
            {
            printf("the file was locked by other process.Can't write.../n");
                printf("errno:%d:",errno);
            }
        
        close(fd);


            }
        else
           {
        printf("cannot open file %s/n",path);
        printf("errno:%d/n",errno);
        printf("errMsg:%s",strerror(errno));
            }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# - C#用fo-dicom对CT图像的PixelData进行处理和转换

转自&#xff1a;c# - C#用fo-dicom对CT图像的PixelData进行处理和转换 - IT工具网 对于某些测试&#xff0c;我试图操纵 PixelData以 dicom 格式存储的 CT 图像的元素&#xff0c;并使用 C# 中的 Fellow Oak Dicom 将其写回文件中。经过一番研究&#xff0c;我发现我想要处理的…

android studio 显示图形_显示服务器实现(一)

在一个多窗口的图形化操作系统中&#xff0c;显示服务器的任务就是组织这些窗口展现给用户。实际的显示服务器有Linux世界基于X11协议的XServer或者Wayland协议的Weston&#xff0c;还有Android里的SurfaceFlinger。但是除了显示&#xff0c;他们同时包含了输入管理&#xff08…

discuzX 帖子 有的图片没输出 [attach]12323[/attach]的解决办法

在pre_forum_post (as p )中&#xff0c;每个帖子都有一个p.attachment字段&#xff0c;这个字段记录了&#xff0c;帖子中有多少张图片&#xff0c;如果为0&#xff0c;则程序不会替换帖子内容(p.message)中的[attach]标签&#xff0c; 在pre_forum_attachment (as a)中&#…

win32 API函数大全

1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束…

如何识别C++编译以后的函数名

C/C语言在编译以后&#xff0c;函数的名字会被编译器修改&#xff0c;改成编译器内部的名字&#xff0c;这个名字会在链接的时候用到。如果用backtrace之类的函数打印堆栈时&#xff0c;显示的就是被编译器修改过的名字&#xff0c;比如说_Z3foov 。 那么这个函数真实的名字是什…

聊聊临时表

什么是临时表临时表与永久表相似&#xff0c;但临时表存储在 tempdb 中&#xff0c;当不再使用时会自动删除。 临时表有两种类型&#xff1a;本地和全局。它们在名称、可见性以 及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头&#xff1b;它们仅对当前的用户连接是…

电脑不能开机维修_MacBook维修 苹果笔记本电脑进水不开机

最近有很多小伙伴来店里&#xff0c;是进水的Macbook苹果笔记本电脑开不开机、黑屏&#xff0c;有很多朋友认为Macbook进水后擦干&#xff0c;只要能开机就没事&#xff0c;实在不开机晾几天就会好了。其实不然。Macbook进水后晾干虽然能开机但有很多后遗症——比如忽然黑屏、反…

Linux Arch目录下处理器体系架构介绍

alpha 处理器 Alpha 处理器最早由美国DEC 公司设计制造&#xff0c;在Compaq &#xff08;康柏&#xff09;公司收购DEC 之后&#xff0c;Alpha 处理器继续得到发展&#xff0c;并且应用于许多高档的Compaq 服务器上&#xff0c;HP &#xff08;惠普&#xff09;收购的Compaq &…

前端和后端的英文_计算机专业的本科生在前端、后端、测试和运维之间该如何选择...

首先&#xff0c;对于计算机专业的同学来说&#xff0c;在选择发展方向的时候往往会遇到一些困惑&#xff0c;当前随着计算机技术体系的不断壮大&#xff0c;计算机领域的岗位分类也越来越细化&#xff0c;而且在新技术的推动下&#xff0c;还在不断出现新的岗位&#xff0c;比…

医学影像后处理技术超详细收藏版(上)

转自&#xff1a;医学影像后处理技术超详细收藏版&#xff08;上&#xff09; 导语&#xff1a; 医学图像后处理是通过综合运用计算机图像处理技术&#xff0c;医学知识&#xff0c;将由各种数字化成像技术所获得的人体信息按照一定的需要在计算机上表现出来&#xff0c;使之…

BulkLoader类使用

BulkLoader提供简单的载入函数&#xff0c;不管要载入的是xml、swf还是声音文件&#xff0c;都只使用同一接口。功能强大&#xff0c;十分推荐。 用法&#xff0c;载入xml文件&#xff1a; var bulkLoader:BulkLoader new BulkLoader(main loading);bulkLoader.add(my_xml_fil…

uboot 详细注释讲解

大多数bootloader都分为stage1和stage2两部分&#xff0c;u-boot也不例外。依赖于CPU体系结构的代码&#xff08;如设备初始化代码等&#xff09;通常都放在stage1且可以用汇编语言来实现&#xff0c;而stage2则通常用C语言来实现&#xff0c;这样可以实现复杂的功能&#xff0…

【转】VTK和ITK中的坐标系统

当我们在处理医学图像和应用时&#xff0c;一个问题就是坐标系统之间的不同。在图像应用中通常有三个坐标系&#xff0c;分别是世界坐标系&#xff0c;解剖坐标系和图像坐标系。 每种坐标系目的不同&#xff0c;呈现数据的方式也不一样。 解剖坐标系由三个平面组成&#xff0c;…

(ZT)在日本市场推广 iPhone 应用的经验

原贴&#xff1a;http://www.cocoachina.com/appstore/market/2010/0728/1942.html 本文作者为 CocoaChina 会员 “lawrencewu”&#xff0c;是一位专攻日本市场的 iPhone 开发者。他的10款 App &#xff08;9个收费&#xff0c;一个免费&#xff09;在9个月的时间里已经取得了…

嵌入式系统 Boot Loader 技术内幕

1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次&#xff1a; 1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选)&#xff0c;和 Boot Loader 两大部分。 2. Linux 内核。特定于嵌入…

互联网医院 2020年突出成就_【关注】中国社科院发布2020中国医院互联网影响力排行榜...

导 读:11月4日&#xff0c;中国社科院健康业发展研究中心联合好大夫在线&#xff0c;发布2020中国医院互联网影响力排行榜&#xff0c;这是该榜单连续第5年发布。中国社科院健康业发展研究中心以好大夫在线平台611.6亿次的患者浏览轨迹、6648万患者的在线问诊记录、4.7亿次医…

集合附加属性(HACK)

传说中的HACK… 靠看文档是不知道的 http://wekempf.spaces.live.com/blog/cns!d18c3ec06ea971cf!468.entry?wawsignin1.0&sa837408022 http://blogs.msdn.com/b/johngossman/archive/2008/07/28/how-to-initialize-an-attached-dependencyproperty-of-type-collection.as…

h5链接加上 vconsole_又出爆款!凯美瑞和红旗H5没法比!

论舒适性而言&#xff0c;三厢版车型的优势还是十分明显的。基本可以满足日常商务用途和家用等多种用车环境。今天带来的两款车都是三厢车&#xff0c;分别是红旗H5和宝马1系。那这两款车究竟是骡子是马&#xff0c;还是让大家一起来看看它们的实际表现吧。车型&#xff1a;红旗…

程序员:如何写出杀手级简历

1. 简历里要有你工作的技术细节&#xff1a; 编程语言&#xff0c;你的个人成就和水平。 我有时会看到一些简历&#xff0c;里面的工作描述就只有一行话&#xff0c;像这样&#xff1a; * 在一个3人组成的团队里开发一个 e-mail 插件。筛选者在阅读你的简历时心里都有选择标准&…