专栏首页HeaiKunCSAPP---系统级IO

CSAPP---系统级IO

系统级IO

什么是IO?Linux中的文件

IO就是输入输出,这个输入输出的对象是针对主存来说的,往主存上复制数据就是输入,从主存上往外部设备上复制就是输出。这些外部设备包括磁盘驱动器,终端和网络等。对于Unix系统来说,一切都被抽象成文件,对于IO操作,实际上就是对文件进行操作。

Linux下的文件

Linux下的每一个文件都有一个类型,用来表明他在文件中所扮演的角色。 Linux下的文件类型一共有七类。普通文件,目录文件,套接字文件,管道文件,链接文件,字符设备文件,块设备文件。 对于文件的路径分为绝对路径和相对路径。 绝对路径不受任何因素的影响,可以直接使用,缺点就是路径太长太复杂。 相对路径比较短,但是受当前的工作路径影响,当前的工作路径变化了,相对路径就会跟着变化。

打开和关闭文件,文件描述符的变化

进程可以通过open函数进行打开一个已经存在的文件或者创建一个不存在的文件。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(char *filename, int flags, mode_t mode); 
        若成功返回新文件描述符,失败返回-1。

flags参数就是指明进程以哪种方式进行访问文件。 mode用来指定新文件的访问权限。

进程可以通过close函数关闭一个已经打开的文件。

#include <unistd.h>
int close(int fd);
        成功返回0,失败返回-1。

文件描述符是非负整数,其中0,1,2这三个已经被系统占用,分别是标准输入,标准输出,标准错误。如果再打开一个文件,那么新的文件描述符就是3,这样依次往上之后增加。 细节注意:被关闭的文件描述符的值没有被清除为-1。程序如下:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
    int fd1 = -1, fd2 = -1, fd3 = -1;
    fd1 = open("foo.txt", O_RDONLY, 0);
    fd2 = open("fxx.txt", O_RDONLY, 0);

    close(fd1);
    printf("fd1= %d \n", fd1);
    printf("fd2= %d \n", fd2);
    printf("fd3= %d \n", fd3);

    fd3 = open("fyy.txt", O_RDONLY, 0);

    printf("fd1= %d \n", fd1);
    printf("fd2= %d \n", fd2);
    printf("fd3= %d \n", fd3);

    fd1 = open("foo.txt", O_RDONLY, 0);
    printf("fd1= %d \n", fd1);
    printf("fd2= %d \n", fd2);
    printf("fd3= %d \n", fd3);

    close(fd1);
    close(fd2);
    close(fd3);
    return 0; 
}

输出结果:

hehk@hehk:~/test/C/io_test$ ./a.out 
fd1= 3 
fd2= 4 
fd3= -1 
fd1= 3 
fd2= 4 
fd3= 3 
fd1= 5 
fd2= 4 
fd3= 3 

关于文件的操作

读写文件:使用read和write函数进行对文件的读写。 读取文件元数据:使用stat和fstat函数获取关于文件的信息。 读取目录内容:使用opendir和closedir函数。

共享文件

内核使用三个相关的数据结构来表示打开的文件。 文件描述符,文件表,v-node表。 通常一个进程中一个文件描述符指向一个文件表项,然后对应一个v-node表项。不同的文件描述符可以对应同一个文件,这样的文件就是共享文件,被两个文件描述符共享,当然还可以被两个进程共享。

本文分享自微信公众号 - HeaiKun(hhk-develop),作者:hehk

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • shell----时间,日历,计算器

    "PS:有段时间没有更新了,而且公号还改名了,最近一直觉得自己原来的公号名字(learnAbit)像培训机构的,思来想去还是改了吧,现在的名字算是我的笔名,以后...

    HeaiKun
  • 是先学会游泳还是先下水?

    看到这句话,大家是不是都是反对这个观点的?对的,这个观点是错误的,但是这个错误的观点,在我们生活中却时时上演着。

    HeaiKun
  • C++ IO库介绍及使用方式

    IO 类型之间的关系 设备类型和字符大小都不会影响IO操作,我们可以使用 >> 读取数据,不用关系是从控制台窗口,一个磁盘文件还是一个 string 对象。也不...

    HeaiKun
  • 来傲游浏览器工作

    帮公司发布一下一些职位的招聘,未来的小伙伴赶紧投递简历哈。投递给我,会有更大的面试特权哈。发送简历给我 andrewallanwallace#gmail.com...

    技术小黑屋
  • 一个前端开发者的自我修养

    一个前端开发者的自我修养 今天给大家分享的主题是前端的自我成长,这是一个关于成长的话题。 很多人都有这样的感觉:听了很多技术圈子的分享,有的有深度,有的循循善诱...

    用户1289394
  • 一个前端开发者的自我修养

    很多人都有这样的感觉:听了很多技术圈子的分享,有的有深度,有的循循善诱,深入浅出,但是呢,几年下来,到底哪些用上了,哪些对自己真的有帮助了?反而...

    用户1667431
  • 小程序扫码成功后带着参数跳转到指定页面

    要扫的二维码,通过草料二维码生成的,这个网站挺好的,用起来比较简单方便,可以直接输入文字生成二维码,也可以放入链接生成二维码。

    祈澈菇凉
  • SQL Server 2008中的hierarchyid

    本人转载:http://www.cnblogs.com/chenxizhang/archive/2009/04/26/1444016.html

    跟着阿笨一起玩NET
  • find命令 原

    语法: find [路径] [参数] ;find [选项] [路径] [filename]

    阿dai学长
  • angular9 添加IE浏览器支持

    路过君

扫码关注云+社区

领取腾讯云代金券