问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

linux用什么标识,描述和控制文件

发布网友 发布时间:2022-04-22 23:55

我来回答

2个回答

热心网友 时间:2023-01-28 03:21

Linux的文件标识符,和Windows的就是文件名不同,它相当于文件的一个指针。在linux的C语言中,除了用通用的《【C】文件读写问题》(点击打开链)中介绍过的fopen等c语言通用操作文件以外,其Linux应用请参考《【Linux】利用C语言文件流复制单一文件),还能用文件标识符还来操作文件。这也是Linux中C语言,最底层,最原始控制文件的方式,其函数open,read,write,close已经完美地表明这一点。同时,在Linux无论是文件、设备和管道,甚至是个可操作对象对可以视作文件来对待,具体表现为都可以用这个文件标识符来操作他们。
文件标识符非常独特,并不是指针,其变量类型就是大家非常常用的int。
至于这个东西怎么用,具体请看如下文件读写程序:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//文件控制
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXSIZE 512//缓冲区的大小
const char* FILEPATH="/tmp/file.txt";//文件目录
int main(void) {
int fd;//文件标识符,
char *s = "被折腾的文字";
char buffer[MAXSIZE+1];//用来接字符的缓冲区
int size;//读入的文件长度
if((fd=open(FILEPATH,O_CREAT|O_TRUNC|O_RDWR,0777))<0){
//O_CREAT如果指定文件不存在,则创建这个文件,O_EXCL如果要创建的文件已存在,则返回 -1,并且修改 errno 的值
//O_APPEND每次写操作都写入文件的末尾,O_TRUNC如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
//O_RDONLY只读模式,O_WRONLY只写模式,O_RDWR读写模式
//0777为最高权限
perror("打开文件失败!");
exit(1);
}
if((write(fd,s,strlen(s)))<0){
perror("写入文件失败!");
exit(1);
}
//lseek(fd,0,SEEK_SET);//即把文件指针移至buf文件的开始处
lseek(fd,-strlen(s),SEEK_END);//即把文件指针往从结尾处向前移动strlen(s)个字符
if((size=read(fd,buffer,MAXSIZE))<0){
perror("读入文件失败!");
exit(1);
}else{
buffer[size]='\0';//字符串数组封口
printf("%s\n",buffer);
}
if(close(fd)<0) {
perror("关键文件失败!");
exit(1);
}
unlink(FILEPATH);//删除文件
exit(0);
}
这个程序的一大堆头文件,是没办法的,因为所用到的函数需要的基本头文件就是这么多,但这些头文件都是Linux的基本头文件,能够拿来直接用。

程序首先打开并同时利用open的参数创建一个文件,之后向这个文件,通过read函数写入一个名为“缓冲区”buffer的字符数组,也就是字符串string的一些东西,然后,写入完毕,因为文件操作光标将会移到文件最后,所以我们要先将其移回文件头,再利用write函数读入这个文件的内容到buffer,并打印到屏幕,最后再用close关闭文件标识符与文件的连接,并利用unlink删除这个文件,如果没有close,unlink将不起作用,因为这个程序正在占用这个/tmp/file.txt,无法删除,如果要强制删除可以考虑remove函数。
所以,上述代码的运行结果如下图:

最后,这个文件自然是要被删除的了,肯定是没有的:

上述程序很简单,但我们更多应该关注这里文件标识符的作用。fd这个int就是文件标识符,相当于FILE *的作用,但他就是一个int。实质上,这个int非常独特,同open函数,int fd里面存着要被操作文件的地址,但它却又不是int *,之后的write和read函数都要根据这个fd所指明的方向来,你可以发现write,read参数都有一个地方,填入了fd,可要求填入的,却是一个int变量,这在windows里面是没有的,同时不了解文件标识符的人,看到write和read的使用可能是云里雾里的,之后的close就更不用说了,就是清楚这个fd与被操作文件的关联关系。
unlink函数则和文件标识符无关,需要一个文件路径的参数。

热心网友 时间:2023-01-28 04:39

在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3。POSIX标准要求每次打开文件时(含socket)必须使用当前进程中最小可用的文件描述符号码,因此,在网络通信过程中稍不注意就有可能造成串话。

内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。部分图片和描述选自于linuxprobe.com/linux-file-descriptor.html,非常感谢原文作者的经验分享。

标准文件描述符图如下:

文件描述与打开的文件对应模型如下图:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何理解“时间就是空间,空间就是时间”? 办公室副主任竞聘演讲稿范文 学校办公室主任竞聘演讲稿范文 最新办公室主任竞聘演讲稿 办公室主任竞聘演讲稿优秀范文 ...堆墨现象,墨线 接地和粘度都正常,请问应如何解决 ...都正常了开始喷印结果喷一条墨线好恐怖怎么解决呀各位老师 威力喷码机 求一份学生会演讲词 大学学生会个人优秀演讲稿 猪肉不能和什么一起吃,猪肉和什么相克 虾片是什么做的哦??? 清蒸皮皮虾怎么剥皮步骤图解,最火的剥虾方式 虾怎么做可以既简单又好吃?我不想每次都直接剥皮蘸酱油啊。。。 简单的白皮虾酱怎么做啊! wps怎么显示两页 WPS排版文字怎么显示页数、、 WPS如何只显示一页? wps表格怎么看打印出来是几页 iPhone X左上角时间后面多一个话筒标志怎么去掉&#xFFFC;? WPS文字在下方不显示页码了(就是显示一共多少页,当前第几页),怎么弄出... wpsword怎么显示多少页、当前在几页那种 wps怎么多页预览 wps文字怎么设置默认显示单页? 怎样看wps表格中有多少页 wps怎么变成多页的了,怎么回到一页一页看啊? 褪黑素的作用有哪些? 平板wps怎么看多页 wps如何看多少页 狐狸毛和兔毛的衣物自己怎么清洗? 美味又解馋的干锅虾,大厨们是如何烹饪出来的? linux下的文件描述符是什么? Linux文件描述符表和文件的关系 福建虾炒面的常见做法? linux怎样获取文件描述符 大家喂虾是怎么喂.去头去尾,还用给虾剥皮吗 win10如何关闭自动锁屏? liunx下怎么区分不同的文件描述符 肉不能和什么食物一起吃 怎么让黑眼圈消失 吃虾的需要剥皮吗? linux 文件描述符最大是多少?怎么计算的? 在家清蒸虾,一剥皮手上都是红色,什么原因 与猪肉相克的食物 猪肉不能与什么同食 虾有什么好吃的的做法 虾要炒多久才熟 猪肉相克食物 我有好多黑眼圈,怎样可以把黑眼圈去掉? 电脑win10怎么关闭开机锁屏画面? 猪肉与常见蔬菜相克