Linux c语言中的IO -- 文件IO

文章目录

  • 1. 文件IO
  • 2. 文件描述符
      • 什么是文件描述符?文件描述符何时产生?
  • 3. 文件IO常用函数
      • open()
      • close()
      • 对比fopen()与open()打开文件权限
      • read()
      • write()
      • memset / bzero 设置一片内存区域的值
      • lseek()
      • stat() 获取文件信息
      • opendir() / readdir() / closedir() 对目录操作

1. 文件IO

文件IO不涉及缓冲区,每执行一次,都会调用Linux内核的系统调用,然后操作硬件设备。

与标准IO不同,文件IO对文件操作时,使用的是文件描述符。

当程序运行时,操作系统会自动为当前程序创建三个文件描述符

  • 0 标准输入文件描述符
  • 1 标准输出文件描述符
  • 2 标准错误输出文件描述符

2. 文件描述符

什么是文件描述符?文件描述符何时产生?

在进程中,当使用open函数打开一个文件时,就会产生一个文件描述符。而这个文件描述符其实是一个数组的下标,所以文件描述符一定是一个非负整数,且会按照顺序分配。它被内核用以标识一个特定进程正在访问的文件。

文件描述符是从小到大依次递增分配,但是如果有文件描述符关闭,则新创建的文件描述符的值会先等于最小的没有使用的值,然后在依次递增创建,所以最后创建的文件描述符不一定是最大的

在进程中找到文件描述符

	struct task_struct{
     //进程的结构体
		volatile long state; //进程运行状态
		unsigned int  cpu;   //cpu的序号
		int			  prio;  //进程运行的优先级
		pid_t		  pid;   //进程号
		struct task_struct 	*real_parent;
		struct list_head		children;
		struct list_head		sibling;
		/* Open file information */
		struct files_struct		*files;
	}

首先,看进程相关的结构体的部分内容,其中有一个结构体指针为struct files_struct *,用来保存该进程打开文件的信息,下面截取结构体struct files_struct部分内容

	struct files_struct {
   
		struct fdtable  *fdt;
		struct file  * fd_array[32];
	};

	struct fdtable {
   
		unsigned int max_fds;
		struct file __rcu **fd;      /* current fd array */
		unsigned long *close_on_exec;  //在执行exec函数时,关闭文件描述符
		unsigned long *open_fds;
		unsigned long *full_fds_bits;
		struct rcu_head rcu;        //有个RCU机制。
	};
	
	union {
   
			struct llist_node	fu_llist;
			struct rcu_head 	fu_rcuhead;
		} f_u;

可以看到该结构体中,又有一个struct file结构体指针数组,意味着该结构体中可以存放32个指向struct file结构体的指针,而struct file中保存着打开文件时的所有信息
我们使用open函数所获得的文件描述符就是这个数组的下标,使用open()的同时,就会创建struct file结构体,前32个文件描述符会静态分配,保证效率,再多就需要动态分配。而这里设定为32个也是考虑时间空间等因素后的经验值。
open()fdfd_array[fd]struct file

struct file结构体中还有一个重要属性atomic_long_t f_count,同一struct file可以被引用多次,这个用来记录该结构体被struct file *同时指向的个数。当struct file *指向该结构体的指针减少一个,f_count就会减一&#

你可能感兴趣的:(C,Linux,linux,c语言)