文件描述符表和文件共享操作

文件描述符表
  当open打开文件成功后,会创建相应的结构体(数据结构),用于保存被打开文件的相关信息
  对文件进行读写操作时,会用到这些信息,这个数据结构就是文件描述符表
进程表:task_struct
  (1).当程序运行时成为一个进程,系统会在内存中开辟一个task_struct结构体,这个结构体又叫进程表
  这个结构体成员项非常多,多达近300个
  (2).task_struct专门用于存放进程在运行过程中所涉及到的所有与进程相关的信息,
  其中文件描述符表就包含在了tak_struct中
  (3).进程运行结束后,进程表所占用的内存空间会被释放

05-文件描述符表和文件共享操作_linux网络编程

 

05-文件描述符表和文件共享操作_linux网络编程_02

文件状态标志:O_RDONLY,O_WRONLY,O_RDWR等open打开时指定的,
  打开时会将文件状态标志保存到文件表,在读写文件时,会先检查文件状态标志,看看有无权限,然后再去操作文件
文件长度:文件的大小
  在写文件的过程中:每写一个字节的数据到文件中去,文件长度就会+1,文件长度是动态更新的
函数指针:
  read,write等操作文件时,会根据底层具体情况的不同,调用不同的函数来实现读写,所以在v节点里保存了这些不同函数的函数指针,方便调用
O_APPEND时,每次写文件时,都会把文件偏移量设置为文件的长度,即把写的位置调整到了末尾,每一次写操作是,文件的内容会增加,那么自然文件的长度会被动态更新,保证每次都从文件末尾开始写数据,
在多次open同一个文件,实现共享操作,指定O_APPEND可防止数据相互覆盖
O_TRUNC:打开文件时清空文件,V节点内容长度修改为0

共享操作文件

一.同一个进程多次open同一个文件
  多次打开同一文件,文件描述符不一样

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#define FILE_NAME "./file.txt"

void print_error(char *str){
    perror(str);
    exit(-1);
}
int main(){
    int fd1=0;
    int fd2=0;
    fd1=open(FILE_NAME,O_RDWR|O_TRUNC|O_APPEND);
    if(-1 == fd1) print_error("1 open error:");
    fd2=open(FILE_NAME,O_RDWR|O_TRUNC|O_APPEND);
    if(-1 == fd2) print_error("2 open error:");
    printf("fd1=%d,fd2=%d\n",fd1,fd2 );

    while(1){
        write(fd1,"php\n",4);
        sleep(1);
        write(fd2,"javascript\n",11);

    }

}

05-文件描述符表和文件共享操作_linux网络编程_03

二.不同进程打开同一个文件

share1.c

#include <stdio.h>
#include <errno.h>
 #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#define FILE_NAME "./file.txt"

void print_error(char *str){
    perror(str);
    exit(-1);
}
int main(){
    int fd1=0;
    
    fd1=open(FILE_NAME,O_RDWR|O_TRUNC|O_APPEND);
    if(-1 == fd1) print_error("1 open error:");
    printf("fd1=%d\n",fd1 );

    while(1){
        write(fd1,"php\n",4);
        sleep(1);

    }

}

 

share2.c

#include <stdio.h>
#include <errno.h>
 #include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#define FILE_NAME "./file.txt"

void print_error(char *str){
    perror(str);
    exit(-1);
}
int main(){
    int fd2=0;
    
    fd2=open(FILE_NAME,O_RDWR|O_TRUNC|O_APPEND);
    if(-1 == fd2) print_error("2 open error:");
    printf("fd2=%d\n",fd2 );

    while(1){
        write(fd2,"js\n",3);
        sleep(1);

    }

}

 

05-文件描述符表和文件共享操作_linux网络编程_04