zoukankan      html  css  js  c++  java
  • Linux下文件的七种类型

    文件属性


    1. 本章引言
    上一章通过学习文件io,知道了如何使用文件io来打开文件,对文件进行读写等操作,那么我们这一章将换一个角度,专门围绕文件属性进行相关的讨论。

    1.1 什么是文件属性?
    我们通过ls查到就是文件属性,只不过ls只显示了部分文件属性。

    1.2 本章讲什么
    本章专门介绍操作文件属性的各种OS API,比如获取文件的读写权限、文件的大小、文件的创建时间等。

    1.3 本章的意义
    本章操作文件属性的OS API,使用的不像文件io的OS API那样频繁,但是学习本章可以让你深入的理解有关文件这个东西,所以非常希望大家能够认真对待本章内容。

    1.4 本章涉及到的OS API有哪些?
    stat、fstat、lstat

    umask

    chmod、fchmod

    chown,fchown,lchown

    link,unlink,remove,rename
    symlink和readlink

    chdir、和getcwd

    看起来很多,不过每一行都是一组,只要理解其中一个,其它的都很好理解。
    而且这些函数,都与我们常用的cd、ls、chmod、chown、pwd等命令息息相关,大家之前就已经熟悉了这些命令,
    所以开解这些函数时,并不会觉得困难。

    同样的,对于这些函数,不要去记,关键是理解,如果用到时,你能够查阅man手册后者资料,快速的把它用起来,就说明你学明白了。


    2. 回顾文件7种类型

    之前将Linux基础的时候说过,在Linux下一切皆是文件,从应用层(应用程序层)看待底层机制时,皆以文件的方式来看待这些机制。

    但是不同的底层机制,毕竟是不同的,比如底层驱动程序,就分为字符设备驱动和块设备驱动,根据底层机制的不同,文件被分
    为了7种类型。


    2.1 文件的7种类型

    我们在学习《Linux基础初级》时讲过,Linux一切皆文件,文件一共分为7类分别是- d c s p l b。

    (1)普通文件(regular file:-)

    1)普通文件根据存放的内容的不同,又分为如下两种

    (a)文本文件
    存放的都是文字编码,文本编辑器打开后,会将这些文字编码翻译为文字图形,以供人识别。


    (b)纯二进制文件(机器码)
    比如经过编译后得到的可执行文件,里面放的是cpu执行的纯二进制机器码,由于文编编辑器只认识文字编码,所以
    用文本编辑器打开后,显示的内容无法是错乱的,无法辨识。


    其实不管存放的是文字编码,还是机器码,在计算机中存储时,其实都是以二进制形式存放的,只不过我们这里可刻
    意的把机器码这类非文字编码的数据,特意强调为了二进制数据。


    2)以存储5为例

    (a)以‘5’存储:在文件中存放的是'5'的ASCII码为53(??00110101?),在计算机中实际存放的是?00110101?。
    (b)以整数5存储:文件中实际存放是整数5(00000101),在计算机中实际存放的是00000101。

    对linux内核而言,这两种文件并无区别,至于文件中的数据如何解释,则由处理这些数据的应用程序(比如文本编辑器)
    来决定。

    不管是文字编码数据,还是纯二进制数据,应用程序调用read、write读写文件时,没有任何区别。


    (2)目录文件(director file:d)
    目录是一种特殊的文件,专门用于管理其它文件。



    (3)字符设备文件(character special file:c)

    字符设备文件,就是字符设备驱动程序,在上层的表现形式。

    当应用程序调用底层字符设备驱动程序,实现对某个字符设备进行读写时,上层就需要对接底层的字符驱动程序,字符设备驱动
    在上层,会以“字符设备文件”的形式表现出来,我们通过open、read、write去读写字符设备文件,就实现了和底层字符设备驱动
    程序的交互。



    (4)块设备文件(block special file:b):对应块设备(如磁盘等)。

    1)块设备文件,是块设备驱动程序在上层的表现形式。


    2)字符设备与块设备有什么区别?

    (a)字符设备
    字节为单位来操作数据。

    比如:键盘、鼠标、显示器都等是字符设备。
    字符设备的驱动程序,就称为“字符设备驱动程序”。


    (b)块设备
    块设备存储的数据量往往非常大,为了提高读写效率,都是以块(1024字节)为单位来操作数据。

    比如:电脑硬盘、移动硬盘、u盘等,凡是涉及大量数据存储的,都是以块为单位来操作数据的,都是块设备。

    块设备的驱动程序,就称为“块设备驱动程序”。


    (5)FIFO(fifo:p)
    管道文件,用于实现不同进程(程序)之间的通信,管道是OS提供的一种纯代码层面的通信机制。

    数据 数据
    A进程 ————————> 管道文件 ————————>B进程


    后面讲进程间通信时,会具体讲到管道这个东西。


    (6)套接字文件(socket:s)
    专门用于网络通信的文件。

    讲到网络编程时,再来具体介绍。


    (7)符号连接(symbolic link:l):
    我们在Linux基础中讲过了,其实就是一种快捷图标,背后指向了另外一个文件。

    这7类文件,其中普通文件数量最多,其次是目录文件,然后才是其它类的文件。


    2.2 如何判断文件的类型
    (1)ls查看- d c l b s p符号来区分


    (2)可以使用file命令来查看

    1)查看普通文件

    (a)如果查看的是文本文件
    会提醒你,它是文字编码格式的文件。

    (b)如果你查看的是纯二进制文件(机器码)

    会提示你,这是一个可以运行的可执行文件。

    a.out: ELF 64-bit LSB executable, x86-64, dynamically linked,
    /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, not strippe

    · ELF:Linux下可执行文件的格式,Windows下的可执行文件是PE格式
    对应格式的可执行文件,只能在对应的OS下运行。

    · 64-bit:文件里面的机器指令是64位的

    · LSB:小端序,C语言里面有详细介绍大小端序

    · executable:明确告诉你,该文件是一个可执行文件

    · x86-64:运行的是intel的i386的、64位的cpu

    · dynamically linked, /lib64/ld-linux-x86-64.so.2
    程序使用的库是动态链接库,库名叫/lib64/ld-linux-x86-64.so.2


    · for GNU/Linux 2.6.32:运行的系统是Linux系统(ubuntu),Linu x 2.6.32是ubuntu所用Linux内核的版本号


    · not strippe:程序没有被瘦身,里面包含有各种用于调试用的信息,当这个程序最终发布时,会使用strip命令
    为程序瘦身,去除里面的无用信息,让程序变的更小。


    2.3 如何对这些文件进行IO操作

    在我们整个课程中,这7类文件都会涉及到,对文件进行IO操作时,使用的都是第1章讲的各种文件io函数,从这里也可以看出,
    所以第1章的内容很重要。

  • 相关阅读:
    Redis存储对象(序列化和反序列化)
    JAVA中关于set()和get()方法的理解以及使用
    5W1H分析法
    Spring AOP的理解(通俗易懂)。
    Notepad++ 使用步骤,熟练掌握notepad++的使用技巧,无疑会大大提升专业技能。以及快捷键操作
    Int,String,Integer,double之间的类型的相互转换
    Ajax局部刷新和全局刷新的区别
    GET和POST都是什么时候用?
    ajax为什么需要json格式响应数据?
    final fially finalize区别
  • 原文地址:https://www.cnblogs.com/lemaden/p/10389254.html
Copyright © 2011-2022 走看看