注册 登录
    欢迎访问本站

Linux下的文件类型介绍

基础知识 逸轩网 153次浏览 已收录

    本篇文章给大家带来的内容是引见Linux下几种文件类型,有一定的参考价值,有需求的冤家可以参考一下,希望对你有所协助。

    在Linux零碎下,有七类文件类型:普通文件(-)目录(d)软链接(字符链接L)套接字文件(S)字符设备(S)块设备(B)管道文件(命名管道P)普通文件、目录、软链接无需多解释。

    上面带大家理解一下管道文件、套接字文件、字符设备、块设备类型。管道文件管道分爲匿名管道和命名管道。管道都是一端写入、另一端读取,它们是双方向数据传输的,它们的数据都是间接在内存中传输的,管道是进程间通讯的一种方式,例如父进程写,子进程读。在shell中匿名管道就是一个管道符号”|”,例如ls | grep xxx,其中ls对应的进程是这个独立进程组中的父进程,grep对应的进程是子进程,父进程写子进程读。在编程言语中,匿名管道是经过创立两个文件句柄或文件描绘符(例如A、B)来完成的,一个文件句柄用于写数据(例如A写入端,数据写入A将自动推入B中),另一个文件句柄用于读数据(即B)。

    关于命名管道,即有称号的管道,命名管道将文件保存在文件零碎中,它也称爲FIFO,也就是first in first out。虽然命名管道文件保存在文件零碎中,但是这个文件只是运用命名管道的一个入口,在运用命名管道传输数据的时分,依然是在内存中停止的,也就是说并不会由于保存在文件零碎上命名管道的效率就低了。

    在shell中,可以运用mknod命令或mkfifo命令创立命名管道,在写某些特殊需求的shell脚本时,命名管道十分有用。实践上,在Bash 4之后就支持协程(运用coproc命令)的功用了(ksh和zsh老早就支持协程),但是协程的需求都能经过命名管道来完成。普通的管道都是单向通讯的,无法完成双向通讯的功用,也就是只能一边写一边读,不能两边都能读、写。

    假如要完成双向通讯,可以创立两根管道(这样就有4个文件句柄,两个读端,两个写端),或许运用更方便的套接字。套接字(Socket)套接字用来完成两端通讯,正如下面剖析的,可以完成双向管道的进程间通讯功用。不只如此,套接字还能经过网络完成跨主机的进程间通讯功用。套接字需求成对才有意义,也就是分爲两端,每一端都有用于读、写的文件描绘符(或文件句柄),相当于两根双向通讯的管道。套接字依据协议族的方式分爲两大类:网络套接字(AF_INET类型,依据ipv4和ipv6分爲inet4和inet6)和Unix Domain套接字(AF_UNIX类型)。当然,从协议族往下,套接字可细分爲很多品种型,例如INET套接字可以分爲TCP套接字、UDP套接字、链路层套接字、Raw套接字等等。其中网络套接字是网络编程的根底和中心。

    Unix Domain套接字关于单机的进程间通讯,运用Unix Domain套接字比Inet套接字更好,由于Unix Domain套接字没有网络通讯组件,也就是少了很多网络功用,它愈加轻量级。实践上,某些言语在某些操作零碎平台上完成的管道功用就是经过Unix Domain来完成的,可想而知其高效率。

    Unix Domain套接字有两个文件句柄(例如A、B),这两个文件句柄都是同时可读、可写的句柄。进程1向A写入数据,将自动推送到B上,进程2可从B上读取从A写入的数据,同理进程2向B中写入数据将自动推送到A上,进程1可从A上读取从B写入的数据。

    如下:进程1            进程2————————A   ———–>  BB   ———–>  A在编程言语中,创立Unix Domain Socket自然有对应的函数轻松创立(可man socketpair)。关于bash shell,可以经过nc命令(NetCat)来创立,或许干脆运用两个命名管道来完成对应的功用。如有需求,可自行理解如何在bash shell中运用Unix Domain套接字。网络套接字关于跨网络的进程间通讯,需求运用网络套接字。每个网络套接字都由5局部组成,它们称爲套接字的5元组。

    格式如下:{protocol, src_addr, src_port, dest_addr, dest_port}即协议、源地址、源端口、目的地址、目的端口。

    每端套接字在内核空间都有两个buffer(即一对socket有4个buffer),每一端都有recv buffer和send buffer。进程1向本人的套接字的send buffer写入数据,将发送到对端的recv buffer中,然后对端的进程2就可以从recv buffer中读取数据,反之亦然。

    但是在真正可以读、写网络套接字之前,网路套接字还需求一些设置。效劳端套接字创立(socket()函数,创立后就会有一个文件句柄或文件描绘符供读、写操作)后,还要绑定地址(经过bind()函数)和监听端口(经过listen()函数),客户端则只需求创立套接字后,间接运用connect()函数向效劳端套接字发起衔接恳求即可。关于TCP套接字,客户端发起衔接恳求即表示要和效劳端停止三次握手(内核完成,和用户空间进程有关)。将这三次握手的每一次停止细分,第一次客户端发送SYN恳求,效劳端接纳到SYN后,内核将这个衔接放进syn queue中并设置形态爲syn-recv,然后发送ack+syn给客户端,当接纳到客户端回复ack后,内核将衔接从syn queue移到established queue(或accept queue)中并将衔接的形态标志爲established。最初等候用户空间的进程发起accept()零碎调用让内核将其从accept queue中移除。

    被accept()后的衔接表示曾经树立好的衔接,可以真正完成两端进程间的数据传输。更多关于TCP套接字的原理,参见我的另一篇文章:不可不知的socket和TCP衔接进程。块设备和字符设备块设备是硬件设备,经过随机(不一定是顺序)拜访固定大小的数据块(chunk)来区分。固定大小的chunk称爲块(block)。

    最罕见的块设备是硬盘,但也存在许多其他块设备,如软盘驱动器、蓝光阅读器和闪存。留意,这些都是挂载文件零碎的设备,文件零碎就像是块设备的通用言语。字符设备经过延续的流数据拜访,一个字节接着一个字节。典型的字符设备是终端(终端分多种,由物理的也有虚拟的)和键盘。区分块设备和字符设备最复杂的办法是看数据拜访的方式。能随机拜访获取数据的是块设备,必需按字节顺序拜访的是字符设备。假如可以这里读一点数据,那里读一点数据,最初串成一整段延续的数据,那麼这个就是块设备,就像硬盘上的数据是不延续的,有能够需求经过随机拜访的方式获取一段数据。比方磁盘上一个稍大一点的文件,能够前10k数据是延续的数据块或在延续的扇区内,之后的10k数据在离它很远甚至在不同的柱面上。

    假如一段数据中的每个字节都跟拜访时的字节顺序是一样的,即字节先后顺序从拜访获取时到最初处置数据的进程中都是完全分歧的,那麼这个就是字符设备。换句话说,字符设备可以看作是流设备。就像键盘输出数据一样,延续敲两个字键,这两个键对应的字节数据在被接纳的时分一定是先敲的在后面,后敲的在前面。同理终端设备也是以一样的,顺序将数据输入到终端时,顺序先输入字母a再输入数字3,那麼显示在终端上时一定是a在前,3在后。


逸轩网 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明
本文标题:Linux下的文件类型介绍
喜欢 (0)
支付宝[[email protected]]
分享 (0)