当前位置:   article > 正文

Linux系统中的文件类型(Linux应用编程篇)_linux文件类型

linux文件类型
  • windows系统下,操作系统识别文件类型一般是通过文件名后缀来判断
  • 虽然Linux系统并不会通过后缀来识别文件,但是文件后缀也要规范、需要根据文件本身的功能属性来添加。
  • LInux系统下一共分为 7种文件类型:
    普通文件
    目录文件
    字符设备文件和块文件
    符号链接文件
    套接字文件
    管道文件

1、普通文件

  • 像文本文件、二进制文件,我们编写的源代码文件这些都是普通的文件。

  • 文本文件:
    譬如常见的.c、.h、.sh、.txt 等这些都是文本文件,文本文件的好处就是方便人阅读、浏览以及编写
    在这里插入图片描述

  • 二进制文件:
    inux 系统下的可执行文件、C 代码编译之后得到的.o 文件、.bin文件等都是二进制文件
    在这里插入图片描述

  • stat 命令非常友好,会直观把文件类型显示出来;对于 ls 命令来说,并没有直观的显示出文件的类型,而是通过符号表示出来。例如:
    在这里插入图片描述
    2、目录文件

  • 目录文件就是文件夹,在linux下面文件夹也是一种文件(特殊的文件)。可以使用vim打开显示。在Linux系统下,会有一些专门的系统调用用于读写文件夹,
    在这里插入图片描述
    3、字符设备和块设备文件

  • 关于设备的驱动开发,对字符设备文件(character)、块设备文件(block)这些文件类型应该都是熟悉的 。

  • Linux 系统下,一切皆文件,也包括各种硬件设备。设备文件(字符设备文件、块设备文件)对应的是硬件设备,在Linux 系统中,硬件设备会对应到一个设备文件,应用程序通过对设备文件的读写来操控、使用硬件设备。

  • 虽然有设备文件,但是设备文件并不对应磁盘上的一个文件,也就是说设备文件并不存在于磁盘中,而是由文件系统虚拟出来的。一般是由内存来维护,当系统关机时,设备文件都会消失。

  • 字符设备文件一般存放在 Linux系统/dev/目录下,所以/dev也称为虚拟文件系统 devfs。
    在这里插入图片描述
    4、符号链接文件

  • 符号链接文件(link)类似于 Windows系统中的快捷方式文件,是一种特殊文件,它的内容指向的是另一个文件路径,当对符号链接文件进行操作时,系统根据情况会对这个操作转移到它指向的文件上去,而不是对它本身进行操作。

  • 符号链接分为两种。软连接硬链接

  • 建立软硬链接
    在这里插入图片描述

  • 二者的区别
    在这里插入图片描述
    在这里插入图片描述软链接文件的大小和创建时间和源文件不同。
    硬链接文件和源文件的大小和创建时间一样。硬链接文件的内容和源文件的内容一模一样,相当于copy了一份。(应用场景:在多用户的操作系统里,你写一个脚本,程序等,没有完成,保存后等下次有时间继续写,但是其他用户有可能将你未写完的东西当成垃圾清理掉,这时,你对你的程序,脚本等做一个硬链接,利用硬链接的同步更新,就可以防止别人误删你的源文件了)

  • 删除源文件对软链接和硬链接的影响(很重要)
    这里要简单说下i节点了。i节点是文件和目录的唯一标识,每个文件和目录必有i节点,不然操作系统就无法识别该文件或目录,就像没有上户口的黑户。
    简单的说下:
    软连接:很简单类比一下windows的快捷方式。
    硬链接: 硬链接文件和源文件i节点号相同,并且一个i节点可以对应多个文件名。删除了jys,只是删除了从920586到jys的映射关系,不影响它和jys.hard的映射关系。此图也解释了硬链接的同步更新,对源文件修改,操作系统只认i节点,于是操作系统就将修改内容写进所有i节点相同名字不同的文件
    在这里插入图片描述
    5、管道文件(pipe)主要用于进程间通信

  • 管道分为无名管道和有名管道两种管道,管道文件是建立在内存之上可以同时被两个进程访问的文件

  • 写入管道的数据是在内存中,无论有名无名。

  • 管道的通讯是半双工,单向性

  • 有名管道
    mkfifo函数创建有名管道,属于系统调用。
    在这里插入图片描述
    创建一个管道 mkfifo fifo
    创建一个只读文件:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <fcntl.h>
int main()
{
	int fdr=open("./fifo",O_RDONLY);
	assert(fdr != -1);
	printf("fdr=%d\n",fdr);
	while(1){
		char buff[128]={0};
		int n=read(fdr,buff,127);
		if(n==0){undefined
			break;
		}
		printf(“buff=%s,n=%d\n”,buff,n);
	}
	close(fdr);
	exit(0);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

创建一个只写文件:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <fcntl.h>
int main()
{
	int fdw=open("./fifo",O_WRONLY);
	assert(fdw != -1);
	printf("fdw=%d\n",fdw);
	while(1)
	{
	    printf("intput:\n");
	    char buff[128]={0};
	    fgets(buff,128,stdin);
	    if(strncmp(buff,"end",3)==0){
	     	break;
	    }
	    write(fdw,buff,strlen(buff)-1);
	}
	close(fdw);
	exit(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

总结:
1.管道为空,读read阻塞
2.管道为满,写write阻塞
关闭管道写端,读就返回为0,不再阻塞
关闭管道的读端,写端,写入数据时,会产生异常

  • 无名管道
    pipe() 创建无名管道
    无名管道只能用在父子进程间
    有名管道可以在任意两个进程间通信

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <fcntl.h>//使用无名管道要引用的头文件

//父子进程,父进程写入,子进程读取
int main()
{
int fd[2];//两个文件描述符
int res=pipe(fd);
assert(res != -1);
pid_t pid=fork();
assert(pid !=-1);

if(pid==0)
 {
     close(fd[1]);//关闭写端
     char buff[128]={0};
     read(fd[0],buff,127);
     printf("buff=%s\n",buff);
     close(fd[0]);//关闭读端
 }
 else
 {
     close(fd[0]);//关闭读端
     write(fd[1],"hello",5);
     close(fd[1]);//关闭写端
 }
 exit(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
  • 29
  • 30
  • 31

6、套接字文件======十分重要

  • 套接字文件(socket)也是一种进程间通信的方式,与管道文件不同的是,它们可以在不同主机上的进程间通信,实际上就是网络通信,
  • 下面是C/S模型的框架,其中涉及到网络知识,三次握手和四次挥手
    在这里插入图片描述

参考链接:https://blog.csdn.net/gao_zhennan/article/details/79127232
参考链接:https://blog.csdn.net/wind_waves/article/details/103035139
参考链接:https://blog.csdn.net/weixin_47397155/article/details/117534983

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/263622
推荐阅读
相关标签
  

闽ICP备14008679号