赞
踩
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);
}
创建一个只写文件:
#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.管道为空,读read阻塞
2.管道为满,写write阻塞
关闭管道写端,读就返回为0,不再阻塞
关闭管道的读端,写端,写入数据时,会产生异常
#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);
6、套接字文件======十分重要
参考链接: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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。