Linux基础篇十 ——文件操作

原创 2016年06月23日 20:02:29

提起文件操作我们就不得不说起两个重要的部分,文件描述符和文件指针,相信很多人都会分不清这两个看起来十分相似的东西,但是,实际上他们两的差别是十分大的。我们先来看看他们到底是什么。

文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB中保存着一份文件描述符表文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。

文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。

每个进程在PCB中都保存着一份文件描述符表,文件描述符就是这个表的索引,已打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体。在file结构体中维护File Status Flag(file结构体的成员f_flags)和当前读写位置(file结构体的成员f_pos)。每个file结构体都指向一个file_operations结构体,这个结构体的成员都是函数指针,指向实现各种文件操作的内核函数。

eg:在用户程序中read一个文件描述符,read通过系统调用进入内核,然后找到这个文件描述符所指向的file结构体,找到file结构体所指向的file_operations结构体,调用它的read成员所指向的内核函数以完成用户请求。

每个file结构体都有一个指向dentry结构体的指针我们传给openstat等函数的参数的是一个路径,例如/home/akaedu/a,需要根据路径找到文件的inode为了减少读盘次数,内核缓存了目录的树状结构,称为dentry cache,其中每个节点是一个dentry结构体,只要沿着路径各部分的dentry搜索即可

每个dentry结构体都有一个指针指向inode结构体inode结构体保存着从磁盘inode读上来的信息。

inode结构体有一个指向super_block结构体的指针。super_block结构体保存着从磁盘分区的超级块读上来的信息

#include <stdio.h>
#include <errno.h>
#include <string.h>
#define _PATH_ "./log"
int main()
{
FILE *fp = fopen(_PATH_, "w");
if( NULL == fp ){
printf("%s open file %s error, error code is : %d\n",__FUNCTION__, _PATH_, error);
return 1;
}
char *str = "this is a test\n";
int i=0;
while( i<100 ){
fwrite(str, 1, strlen(str),fp);
i++;
}
fclose(fp);
return 0;
}
上面的例子里我们使用的是fwrite,接下来再让我们看一个write符来操作文件的例子

#include <unistd.h>
#include <stdio.h>
int glob = 6; 
char buf[] = "a write to stdout\n";
int
main(void)
{
int var;
pid_t pid;
var = 88;
if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)
perror("write error");
printf("before fork\n"); /* we don't flush stdout */
if ((pid = fork()) < 0) {
perror("fork error");
}else if (pid == 0) { /* child */
glob++; /* modify variables */
var++;
}else {
sleep(2); /* parent*/
}
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob,var);
exit(0);
}
**write是不带缓冲的(系统调用不带缓冲)

**标准I/O是缓冲的,标准输出到终端是行缓冲,否则就变成了全缓冲。

有时将结构定位到标准输出和文件里出现的结果是不同的,但是我们不必感到困惑,只不过是父进程的缓冲区的内容还没被刷新出来之前就被子进程复制了,所以子进程也会在

程序结束的时候在文件里刷新出重复的内容。

**父子进程的使用相同的描述符共享操作同一个文件。

fork之后处理的⽂件描述符有两种常见的情况:
⽗进程等待⼦进程完成。在这种情况下,⽗进程⽆需对其描述符做任何处理。当⼦进程终⽌后,⼦进程对⽂件偏移量的修改已执⾏的更新。
⽗⼦进程各⾃执⾏不同的程序段这种情况下,在fork之后,⽗⼦进程各⾃关闭他们不需要使⽤的⽂件描述符,这样就不会⼲扰对⽅使⽤⽂件描述符。




版权声明:本文为博主原创文章,未经博主允许不得转载。

鸟哥的Linux私房菜 基础学习篇(第三版)

第零章 计算器概论 1 计算机:辅助人脑的好工具 接收用户指令与数据,经由中央处理器的数学与逻辑单元运算处理后,以产生或存储成有用的信息。 1.1 计算器的五大单元 输入单元,CPU控制单元,CPU算...
  • niuzhihuan
  • niuzhihuan
  • 2015年08月03日 20:17
  • 1015

《鸟哥的linux私房菜:基础学习篇》第3版 - 核心笔记(全)

一、什么是 Linux 呢?! • Unix 与 Linux 的历史     o Multics 系统:由 Bell(贝尔实验室)、MIT(麻省理工学院)与 GE(美国通     用电器)合作开发的...
  • sinat_36184075
  • sinat_36184075
  • 2017年05月19日 23:50
  • 613

TCP/IP 教程(针对LINUX的网络基础请参看 《鸟哥的Linux私房菜 服务器架设篇(第三版) 》)

TCP/IP 是针对因特网的通信协议。 在此教程中,你将了解到什么是 TCP/IP,以及它如何工作。开始学习 TCP/IP ! TCP/IP 是因特网的通信协议。 通信协议是对计算机必须遵...
  • u010794281
  • u010794281
  • 2015年09月16日 18:31
  • 1611

鸟哥的Linux基础篇整理---1

1、在 Linux 这个系统当中,几乎所有的硬件装置文件都在/dev 这个目录下。 2、几个重要的存储文件       1)、 /etc/passwad :所有的系统上的账号与...
  • zy00000000001
  • zy00000000001
  • 2017年06月25日 22:11
  • 173

基础篇:ubuntu的使用

自知转乎  教授豪   原文链接:HTTPS://zhuanlan.zhihu.com/p/32579020 一文件目录操作 在Ubuntu的的的的下面使用命令行来对文件...
  • jiachen0212
  • jiachen0212
  • 2018年01月08日 14:00
  • 890

电子书-鸟哥的Linux私房菜--基础学习篇(第3版).pdf

http://pan.baidu.com/s/1pJmGh5L 提取密码:6u6u
  • mythling
  • mythling
  • 2014年07月27日 21:14
  • 396

Java 之JNI基础篇(一)

JNI,即Java Native Interface。它其实就是一套java与本地代码交互的接口或者说是一个协议。通俗的比喻,就是中国人讲中国话,日本人讲日本话,于是中国人碰到日本人,各说各话,无法交...
  • yingshukun
  • yingshukun
  • 2018年01月13日 18:51
  • 10001

【鸟哥的linux私房菜】终于再次读完《Linux 基础篇》——一些感想

今年暑假才开始入门linux,听说鸟哥的书挺适合入门的,于是就开始从《鸟哥的linux私房菜——基础篇》开始学,暑假的时候,比较粗略地看过了一遍,对linux系统有了整体的概念,也做了一些小笔记,不过...
  • jiange_zh
  • jiange_zh
  • 2015年11月16日 00:28
  • 5705

JAVA语言程序设计(基础篇)第十版

Queue类 import java.util.Arrays; public class Queue { private int[] element; private int size=8; Queu...
  • summerdream_
  • summerdream_
  • 2017年07月04日 09:06
  • 707

鸟哥的Linux私房菜基础篇第三版 -- 目录

服务器端使用的OS,Linux是最最常用的,所以,日常的部署、排查问题,就不可避免的与Linux打交道,日积月累,对Linux就有了多多少少的了解。 反过来,再系统的从头开始,读一本关于Linux基础...
  • puma_dong
  • puma_dong
  • 2015年09月27日 22:49
  • 2041
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux基础篇十 ——文件操作
举报原因:
原因补充:

(最多只允许输入30个字)