概述
- 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应用编程篇)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复