`
envy2002
  • 浏览: 152553 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

linux file open的实质

阅读更多

 

 

linux open file的时候到底做了什么呢?

如图:

 

这样多线程对文件读写,可见,也是需要对文件进行同步保护的。

 

但是这和内存变量的同步似乎有些不太一样,也就是用mutex好像不能互斥文件open之后的读写吧?

 

看来需要锁这个东西,它的机制和内存锁mutex应该是一样的吧,猜测的!希望后面能看到例子。

 

代码保存一下:

 

 

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>


int main(int argc, char **argv)
{
      int file_id1=open("test.txt",O_RDWR);
      
      if(file_id1<0)
      	printf("open file_id_1 is error\n");
      
      printf("file_id_1 is %d\n",file_id1);
      
      
     int file_id2=open("test.txt",O_RDWR);
      
      if(file_id2<0)
      	printf("open file_id_2 is error\n");
      
      printf("file_id_2 is %d\n",file_id2);
      
     // int jump_length=lseek(file_id1,10,SEEK_SET);
      
      //sleep(60);
      
      char buffer1[128]={0};
      char buffer2[128]={0};
      
  
      
     
     int length1= read(file_id1,buffer1,10);
      printf("length1 %d\n",length1);
      printf("content1 %s\n",buffer1);
      
      
       char * write_string="######";
      write(file_id1,write_string,strlen(write_string));
      
       int length2= read(file_id1,buffer2,20);
      printf("length2 %d\n",length2);
      printf("content2 %s\n",buffer2);
      
      
      
      
      return 0;
      
}

 

 2. 文件的锁。文件的锁从进程的视角来锁定某个文件。

 

   函数int lockf(int fie_id, int function,int length);

 

   file_id 为要锁定文件的文件标示符,function可以取以下参数 

 

   F_ULOCK 为一个先前锁定的区域解锁

 

   F_LOCK    锁定一个区域

 

  F_TLOCK    测试并锁定一个区域

 

  F_TEST      测试一个区域是否已经上锁。

 

 

  这个锁的机制和内存的锁定机制是极其类似的,所以我们直接上代码:

 

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>


int main(int argc, char **argv)
{
      int file_id1=open("test.txt",O_RDWR);
      
      if(file_id1<0)
      	printf("open file_id_1 is error\n");
      
      printf("file_id_1 is %d\n",file_id1);
      
      
     int file_id2=open("test.txt",O_RDWR);
      
      if(file_id2<0)
      	printf("open file_id_2 is error\n");
      
      printf("file_id_2 is %d\n",file_id2);
      
     // int jump_length=lseek(file_id1,10,SEEK_SET);
      
      //sleep(60);
      
      char buffer1[128]={0};
      char buffer2[128]={0};
      
  
     
    
    
     lockf(file_id1,F_LOCK,10L);
     
     int length1= read(file_id1,buffer1,10);
      printf("length1 %d\n",length1);
      printf("content1 %s\n",buffer1);
      
      sleep(20);
    /*   char * write_string="######";
      write(file_id1,write_string,strlen(write_string));
      
       int length2= read(file_id1,buffer2,20);
      printf("length2 %d\n",length2);
      printf("content2 %s\n",buffer2);
      
      */
      
      
      
      return 0;
      
}
 

 

 

 

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>


int main(int argc, char **argv)
{
      int file_id1=open("test.txt",O_RDWR);
      
      if(file_id1<0)
      	printf("open file_id_1 is error\n");
      
      printf("file_id_1 is %d\n",file_id1);
      
      
     int file_id2=open("test.txt",O_RDWR);
      
      if(file_id2<0)
      	printf("open file_id_2 is error\n");
      
      printf("file_id_2 is %d\n",file_id2);
      
      int jump_length=lseek(file_id1,10,SEEK_SET);
      
      //sleep(60);
      
      char buffer1[128]={0};
      char buffer2[128]={0};
      
  
     
    
    
     lockf(file_id1,F_LOCK,10L);
     
     int length1= read(file_id1,buffer1,10);
      printf("length1 %d\n",length1);
      printf("content1 %s\n",buffer1);
      
      sleep(20);
    /*   char * write_string="######";
      write(file_id1,write_string,strlen(write_string));
      
       int length2= read(file_id1,buffer2,20);
      printf("length2 %d\n",length2);
      printf("content2 %s\n",buffer2);
      
      */
      
      
      
      return 0;
      
}

 

  先运行fork.c,fork.c会锁定test.txt文件,如果锁到和fork2进程操作的test.txt的同一个位置,那么会阻塞fork2进程。

 

效果图:

 

 

这里有个问题是,文件是可以被多个进程访问的,但是如果我们的进程如果不用lockf的话是可以访问到,读写任何文件的,但是其实比如有些程序是不想让其他文件在自己修改的同时,被其他程序修改的,这时,我们可以利用F_TEST参数来测试

 

这个文件是否被其他进程lock,如果这个文件被其他进程lock,则函数 int result=flock(file_id, F_TEST, 0L); 会返回-1,如果没有锁定的位置相交,则返回0;

 

这时我们可以适度加锁,来避免和别的进程来争抢资源。

分享到:
评论

相关推荐

    openFOAM基础-编译applications和libraries

    关于编译器,我们可以直接使用LINUX自带的make程序,但openFOAM又提供了一个编译程序wmake,它建立在make的基础上,但比make更强大和简单。并且wmake不仅可以用于openFOAM library,而且可以用于任何c++代码。 open...

    linux试题试卷含具体答案

    文件系统**:虽然Linux包含了文件系统,但它本质上是一个操作系统。 - **B. 操作系统**:这是最准确的描述。 - **C. 数据库系统**:Linux并不是一个数据库系统。 - **D. 完整系统**:这个词不太准确描述Linux,尽管...

    LINUX驱动设计

    在Linux中,驱动程序和应用程序在结构上存在一些本质的不同。应用程序通常有一个main函数作为入口点,而驱动程序通常使用特殊的模块初始化函数作为入口。应用程序执行一个独立的任务完成后结束,而驱动程序在初始化...

    电子科技大学,嵌入式linux设备驱动程序的开发

    Linux设备驱动程序本质上就是内核与外部设备之间的接口,它的作用在于隐藏硬件的具体实现细节,为应用程序提供统一的访问方式。 #### 设备文件的分类 Linux系统中的设备文件主要分为两类:字符设备和块设备。 1. ...

    虚拟字符设备驱动程序在Linux的实现

    Linux下的设备驱动程序实质上是一组驻留在内存中的特殊低级硬件处理程序集合,它们作为系统内核与外围设备之间的桥梁,使操作系统能够有效地控制硬件资源。 #### Linux中设备驱动程序的基本结构 在Linux系统中,...

    12 openEuler操作系统启动管理.pdf

    - 在`systemd`中,每个服务都有一个对应的单元文件(unit file),通常位于`/lib/systemd/system/`目录下。 - 单元文件定义了服务的各种属性,如启动命令、重启策略等。 - 用户可以通过编辑这些单元文件来修改服务...

    浅谈Linux的库文件

    最近在Linux下使用第三方库Protobuf时,遇到一个问题:可执行程序在运行时报错:“error while loading shared libraries: libprotobuf.so.7: cannot open shared object file: No such file or directory”。...

    Linux字符设备驱动程序的设计

    命名规则是指在Linux字符设备驱动程序中,每个设备的驱动程序都有一组实质上相同的函数,这些函数需要添加至内核原码中以重新生成内核。为了防止不同驱动程序之间函数名的冲突,必须确保名称的唯一性,最好的方法是...

    Linux通过匿名管道进行进程间通信

    FILE* popen(const char *command, const char *open_mode); int pclose(FILE *stream_to_close); ``` - `popen(command, open_mode)`:`command`参数为要执行的命令及其参数,`open_mode`可以是`"r"`(只读)或`"w...

    LINUXPERL学习和分析生物学信息的电脑工具.pdf

    # Open the database file open (db, "human_kinases_swissprot.txt") || die "problem opening the file human_kinases_swissprot.txt\n"; # Search the database line by line while () { chomp; # Check if ...

    Linux内核设备驱动之字符设备驱动笔记整理

    用户通过标准的I/O函数(如open、write、read)与设备交互,其实质是调用了驱动程序提供的接口。 **主设备号与次设备号** 在Linux中,设备被唯一地识别通过主设备号和次设备号。主设备号标识了对应驱动程序,同一...

    嵌入式Linux下ARM通过主机接口加载DSP

    Linux驱动程序实质上是一组函数的集合,通过file_operations结构与文件系统相互作用,提供对设备的操作接口。对于HPI驱动程序,需要实现open、mmap等操作。 实现DSP的HPI驱动程序需要编写一系列操作函数。例如,...

    The open Git resource pulled together by the whole community

    它最初由Linux Torvalds于2005年开发,旨在支持Linux内核的开发工作。Git的核心优势在于其独特的数据存储方式,这使得Git与其他版本控制系统(如SVN)有着本质的区别。 - **数据存储方式**:Git将每次提交看作是一...

    一个IO传奇的一生.pdf

    在Linux系统中,对文件的操作,无论是读取还是写入,本质上都是I/O操作。当用户执行一个写操作,比如将Word文档保存到硬盘时,这个过程会涉及到文件系统层面的多种操作。首先,用户态下的应用程序会通过系统调用陷入...

    你知道一台Linux服务器可以负载多少个连接吗

    在探讨Linux服务器能负载多少个连接之前,首先要理解TCP连接的本质。TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,它基于四元组(src_ip, src_port, dst_ip, dst_port)来唯一识别一个...

    LINUX进程间通信:PIPE与FIFO - 山 人 - 博客园1

    管道本质上是在内存中开辟的一块缓冲区,并提供一对文件描述符供读写操作。它的工作原理如下: 1. **管道创建**:通常由父进程调用`pipe()`函数创建管道,此函数会返回两个文件描述符,分别用于读取和写入。 2. **...

    对TXT文档的操作类

    with open('new_file.txt', 'w') as f: f.write('这是新的TXT内容') ``` **替换 TXT 文档内容** 替换 TXT 文档中的内容涉及读取原有文件,修改内容,然后重新写入。Python 中可以这样操作: ```python with open...

    嵌入式课件\Class3.25\第6章 文件操作.ppt

    除此之外,还有针对文件属性和目录的其他系统调用,如file attributes和directory操作。 库函数,尤其是标准I/O库,提供了一种更高级、更方便的方式来处理文件操作。它们在系统调用的基础上封装了更多的功能,例如...

Global site tag (gtag.js) - Google Analytics