基础I/O

系统IO 
先来看一段代码: 
hello.c写文件

 #include<stdio.h>
 #include<sys/types.h>
 #include<sys/stat.h>
 #include<fcntl.h>
 #include<unistd.h>
 #include<string.h>
 int main (){
     umask(0);
     int fd = open("myfile",O_WRONLY|O_CREAT,0644);
     if(fd < 0){
         perror("open");
         return 1;
     }
     int count = 5;
     const char *msg = "hello world!\n";
     int len = strlen(msg);
     while(count--){
         write(fd,msg,len);
     }
     close(fd);
     return 0;
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

hello.c读文件

 #include<stdio.h>
 #include<sys/types.h>
 #include<sys/stat.h>
 #include<fcntl.h>
 #include<unistd.h>
 #include<string.h>
  int main (){
     umask(0);
     int fd = open("myfile",O_WRONLY);
     if(fd < 0){
         perror("open");
         return 1;
     }
     int count = 5;
     const char *msg = "hello world!\n";
    char buf[1024];
     while(1){
         ssize_t s = read(fd,buf,strlen(msg));//类比write
         if(s > 0){
             printf("%s",buf);
         }
         else{
             break;
         }
      }
     close(fd);
     return 0;
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

接口介绍: 
open

 #include<sys/types.h>
 #include<sys/stat.h>
 #include<fcntl.h>

 int open(const *pathname,int flags);
 int open(const *pathname,int flags,mode_t mode);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

pathname:要打开或创建的目标文件。 
flags:打开文件时,可以传入多个参数选项,用下面的一个或多个常量进行“或”运算,构成flags。 
参数: 
O_RDONLY:只读打开 
O_WRONLY:只写打开 
O_RDWR:读,写打开 
这三个常量,必须指定一个且只能指定一个 
O_CREAT:若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限 
O_APPEND:追加写 
返回值: 
成功:新打开的文件描述符 
失败:-1 
open函数返回值 
像fopen,fclose,fread,fwrite都是C标准库当中的函数,称之为库函数;而像open,close,read,write,lseek都属于系统提供的接口,称之为系统调用接口。 
这里写图片描述 
所以,可以认为f#系列的函数,都是对系统调用的封装,方便二次开发。 
文件描述符fd 
Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0,标准输出1,标准错误2。 
0,1,2对应的物理设备一般是:键盘,显示器,显示器。 
这里写图片描述
文件描述符就是从0开始的小整数。当我们打开文件时,操作系统下内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体,表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*file,指向一张表files_struct,该表最重要的部分就是包含一个指针数组,每个元素都是一个指向打开文件的指针。所以,本质上文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件。 
理解文件系统 
在使用ls -l命令的时候,我们看到的除了文件名,还看到了文件元数据。 
这里写图片描述 
每行包含7列: 
(1)模式 
(2)硬链接数 
(3)文件所有者 
(4)组 
(5)大小 
(6)最后修改时间 
(7)文件名 
ls -l读取存储在磁盘上的文件信息,然后显示出来。 
这里写图片描述
这个信息除了通过这种方式来读取,还有一个stat命令能够看到更多的信息。 
这里写图片描述 
inode 
为了能解释清楚inode,我们先简单的了解一下文件系统: 
这里写图片描述 
超级块:存放文件系统本身的结构信息。 
i节点表:存放文件属性(如文件爱你大小,所有者,最近修改时间等) 
数据区:存放文件内容。 
我们touch一个新文件来看看它是如何工作。这里写图片描述 
这里写图片描述
创建一个新文件主要有4个操作: 
1.存储属性 
内核先找到一个空闲的i节点(这里是18312430),内核把文件信息记录到其中。 
2.存储数据 
该文件西药存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。 
3.记录分配情况 
文件内容按顺序300,500,800存放,内核下inode上的磁盘分布区记录了上述块列表。 
4.添加文件名到目录 
新的文件名test.c,内核将入口(18312452,test.c)添加到目录文件,文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值