zoukankan      html  css  js  c++  java
  • linux文件表项测试

    直接上代码:

    #include <stdio.h>
    #include <fcntl.h>
    #include <string.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    int main() {
        FILE *f1 = fopen("./sysv_msgque.cpp", "r");
        printf("lseek():%d
    ", ftell(f1));
        FILE *f2 = fopen("./sysv_msgque.cpp", "r"); // f1、f2相互独立
        printf("lseek():%d
    ", ftell(f2));
    
        char buffer[256];
        int r_size;
        r_size = fread(buffer, 1, 10, f1);
        printf("%s
    ", buffer);
        r_size = fread(buffer, 1, 5, f2);
        printf("%s
    ", buffer);
        printf("lseek():%d
    ", ftell(f1));
        printf("lseek():%d
    ", ftell(f2));
    
        int o1 = open("./sysv_msgque.cpp", O_RDONLY);
        int o2 = open("./sysv_msgque.cpp", O_RDONLY);
        int o3 = dup(o2);  // o1、o2之间互相不影响,o3、o2之间共用一个文件表项,共享文件位移量
        memset(buffer, 0, 256);
        lseek(o1 , 5 , SEEK_SET);
        read(o1, buffer, 1);
        printf("%s
    ", buffer);
        memset(buffer, 0, 256);
        read(o2, buffer, 1);
        printf("%s
    ", buffer);
        memset(buffer, 0, 256);
        read(o3, buffer, 1);
        printf("%s
    ", buffer);
    }

    测试结果是:每一次打开的文件描述符(即使打开相同文件)之间使用的是不同的文件表项,由dup函数复制返回的两个文件描述符才会使用相同的文件表项,共享各类值。

    引用自 https://blog.csdn.net/qq_28114615/article/details/94590598 :

    1. 每次调用open或者create(内部实际上还是调用的open),都会对新打开的文件分配一个file结构体,并且将打开文件的标志、状态、权限等信息填入这个file结构体中。这个file结构体也叫文件表项;

    2. 磁盘中的每个文件都对应一个i-node,每一个文件表项都会指向一个文件的i-node,但是同一文件的i-node可以对应多个文件表项(当多次调用open打开同一个文件时就会出现这种情况,不管是同一进程多次打开同一文件(如图中A进程的0号和2号文件描述符对应两个文件表项,但是最终指向同一i-node即同一文件),还是不同进程多次打开同一文件(如图中A进程3号文件描述符和B进程的3号文件描述符));

    3.  同一进程下的不同文件描述符是可以指向同一文件表项,即最终指向同一文件;

    4. 子进程在创建时会拷贝父进程的打开文件描述符表,因此父子进程是共享文件表项的;

    5. 指向同一文件表项的不同文件描述符共享文件标志、文件偏移等信息;

    6. 对于指向同一文件表项的两个不同文件描述符,即使其中一个文件描述符关闭了,只要仍然有文件描述符指向这个文件表项,那么就依然能通过这个文件表项访问文件,直到所有指向该文件表项的文件描述符都关闭了才不能再进行访问;

  • 相关阅读:
    idea 连接 hive
    css img自适应
    测试视频文件
    ubuntu不显示ipv4地址的解决办法
    nginx path捕获
    union all两个结果集报ORA-12704: character set mismatch错误
    润乾报表试用指南
    报表工具对比之润乾报表与锐浪报表对比
    项目微管理36
    docker远程调用
  • 原文地址:https://www.cnblogs.com/starRebel/p/14601173.html
Copyright © 2011-2022 走看看