我是靠谱客的博主 坦率小兔子,最近开发中收集的这篇文章主要介绍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=%dn",fdr);
	while(1){
		char buff[128]={0};
		int n=read(fdr,buff,127);
		if(n==0){undefined
			break;
		}
		printf(“buff=%s,n=%dn”,buff,n);
	}
	close(fdr);
	exit(0);
}

创建一个只写文件:

#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=%dn",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.管道为空,读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=%sn",buff);
     close(fd[0]);//关闭读端
 }
 else
 {
     close(fd[0]);//关闭读端
     write(fd[1],"hello",5);
     close(fd[1]);//关闭写端
 }
 exit(0);

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

最后

以上就是坦率小兔子为你收集整理的Linux系统中的文件类型(Linux应用编程篇)的全部内容,希望文章能够帮你解决Linux系统中的文件类型(Linux应用编程篇)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部