当前位置: 首页 > wzjs >正文

中国纪检监察报电子版下载关键词seo深圳

中国纪检监察报电子版下载,关键词seo深圳,emlog建站教程,苏州网站建设制作服务商🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux】进程控制 🔖流水不争,争的是滔滔不 一、理解文件 文件类型 普通文件&#xf…

🔥个人主页🔥:孤寂大仙V
🌈收录专栏🌈:Linux
🌹往期回顾🌹:【Linux】进程控制
🔖流水不争,争的是滔滔不


一、理解文件

文件类型

  • 普通文件:包含用户数据,如文本文件、二进制可执行文件、图像文件、音频文件等。文本文件可以用文本编辑器打开查看和编辑,二进制文件则包含了机器可执行的指令或特定格式的数据。
  • 目录文件:用于组织和管理其他文件和目录,类似于 Windows 系统中的文件夹。它包含了指向其他文件和目录的索引信息。
  • 设备文件:在Linux中,硬件设备也被视为文件,分为字符设备文件和块设备文件。字符设备文件通常用于像串口、终端这样以字符流方式进行数据传输的设备;块设备文件用于如硬盘、U盘等以块为单位进行数据读写的设备。
  • 链接文件:类似于 Windows系统中的快捷方式,分为硬链接和软链接(符号链接)。硬链接是同一个文件的多个名称,它们共享相同的 inode号;软链接则是指向另一个文件的特殊文件,有自己独立的 inode 号。
  • 管道文件:主要用于进程间通信,允许两个或多个进程之间进行数据的传递和共享。
  • 套接字文件:用于网络通信或本地进程间通信,是网络编程和一些进程间通信机制的重要组成部分。

狭义理解

  • 文件在磁盘里。
  • 磁盘是永久性存储介质,因此⽂件在磁盘上的存储是永久性的。
  • 磁盘是外设(即是输出设备也是输入设备)
  • 磁盘上的文件 本质是对文件的所有操作,都是对外设的输⼊和输出 简称 IO

广义理解

• Linux 下⼀切皆文件(键盘、显示器、网卡、磁盘…… 这些都是抽象化的过程)

文件操作的归类认知

• 对于 0KB 的空文件是占用磁盘空间的
• 文件是文件属性(元数据)和文件内容的集合(文件 = 属性(元数据)+ 内容)
• 所有的文件操作本质是文件内容操作和文件属性操作

系统角度

  • 对文件的操作本质是进程对文件的操作
  • 磁盘的管理者是操作系统
  • 文件的读写本质不是通过 C 语⾔ / C++ 的库函数来操作的(这些库函数只是为用户和提供方便),而是通过文件相关的系统调用接口来实现的

二、C语言文件接口

打开文件

#include <stdio.h>
int main()
{FILE *fp = fopen("myfile", "w");if(!fp){printf("fopen error!\n");}while(1);fclose(fp);return 0;
}

写文件


int main()
{FILE* fp=("myfile","w");if(!fp){printf("perror\n");}const char* msg="gujidaxian"int count=5while(count--){fwrite(msg,strlen(msg),1,fp);}fclose(fp);return 0;
}

读文件

#include <stdio.h>
#include <string.h>int main()
{// 以只读模式打开文件 "myfile"FILE *fp = fopen("myfile", "r");if (!fp) {// 若文件打开失败,输出错误信息并返回 1printf("fopen error!\n");return 1;}// 定义一个长度为 1024 的字符数组用于存储从文件中读取的数据char buf[1024];const char *msg = "hello bit!\n";while (1) {// 从文件中读取数据到 buf 数组,每次读取 strlen(msg) 个字节ssize_t s = fread(buf, 1, strlen(msg), fp);if (s > 0) {// 在读取的数据末尾添加字符串结束符buf[s] = '\0';// 输出读取的数据printf("%s", buf);}// 检查是否到达文件末尾,如果是则跳出循环if (feof(fp)) {break;}}// 关闭文件fclose(fp);return 0;
}

实现简单cat命令:

#include <stdio.h>
#include <string.h>int main(int argc, char* argv[]) {// 检查命令行参数数量是否为 2if (argc != 2) {printf("argv error!\n");return 1;}// 以只读模式打开命令行参数指定的文件FILE *fp = fopen(argv[1], "r");if (!fp) {printf("fopen error!\n");return 2;}// 定义一个字符数组用于存储从文件中读取的数据char buf[1024];// 进入循环,持续从文件中读取数据while (1) {// 从文件中读取数据到 buf 数组,每次最多读取 sizeof(buf) 个字节int s = fread(buf, 1, sizeof(buf), fp);if (s > 0) {// 在读取的数据末尾添加字符串结束符buf[s] = '\0';// 输出读取到的数据printf("%s", buf);}// 检查是否到达文件末尾,如果是则跳出循环if (feof(fp)) {break;}}// 关闭文件fclose(fp);return 0;
}

C语言stdin & stdout & stderr

我们把信息输出到显示器,有几种方法

#include <stdio.h>
#include <string.h>
int main()
{const char *msg = "hello fwrite\n";fwrite(msg, strlen(msg), 1, stdout);printf("hello printf\n");fprintf(stdout, "hello fprintf\n");return 0;
}

C会默认打开三个输入输出流,分别是stdin & stdout & stderr
这三个流的类型都是FILE*, fopen返回值类型,文件指针

#include <stdio.h>
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;

stdin是标准输入,对应键盘文件。stdout是标准输出,对应显示器文件。stderr是标准错误,对应显示器文件。为什么这样设置,因为程序是做数据处理的。

打开文件的方式

在这里插入图片描述
当以w的方式打开文件的时候,也就是想向文件内写内容。文件会先被清空。

echo进行重定向就是用w的方式打开文件然后进行写入
在这里插入图片描述
第一次把aaaaa重定向进文件log.txt,然后第二次把bbbbbb重定向进文件log.txt,发现第一次重定向的内容被清空了。


当以a的方式打开文件的时候,也是向文件内写入内容。只不过这是追击内容,之前的内容不会被清空。

echo进行追加重定向是用a的方式打开文件,然后追加写入内容。
在这里插入图片描述
先把aaaaa重定向写入文件log.txt,然后第二次进行追加重定向把bbbbb以追加的方式写入文件log.txt。此时之前的内容不会被清空。

三、系统文件IO

上面聊的C语言的文件操作只是语言层上的打开方式。但是系统才是打开文件的最底层的方案。我们也可以以系统接口的方式访问文件。

系统接口
在这里插入图片描述

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname: 要打开或创建的⽬标⽂件
flags: 打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成flags。
参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定⼀个且只能指定⼀个O_CREAT : 若⽂件不存在,则创建它。需要使⽤mode选项,来指明新⽂件的访问权限O_APPEND: 追加写
返回值:
成功:新打开的⽂件描述符
失败:-1

写入文件

清空并写入

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>int main()
{umask(0);int fd=open("log.txt",O_CREAT | O_WRONLY | O_TRUNC,0666);if(fd<0){perror("open");return 1;}printf("fd: %d\n",fd);const char* msg="hello hhh";int cnt=1;while(cnt--){write(fd,msg,strlen(msg));}close(fd);return 0;
}

在这里插入图片描述
追加并写入

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>int main()
{umask(0);int fd=open("log.txt",O_CREAT | O_WRONLY | O_TRUNC ,0666);if(fd<0){perror("open");return 1;}printf("fd: %d\n",fd);const char* msg="hello bbbb";int cnt=1;while(cnt--){write(fd,msg,strlen(msg));}close(fd);return 0;
}

注意上面的加入函数umask(0);就可以自己规范权限。

读文件

int main()
{int fd = open("myfile", O_RDONLY);if(fd < 0){perror("open");return 1;} const char *msg = "hello bit!\n";char buf[1024];while(1)
{ssize_t s = read(fd, buf, strlen(msg));//类⽐writeif(s > 0){printf("%s", buf);}else{break;}} close(fd);return 0;
}

这里的接口都是系统调用,而上面的c语言的文件操作都是语言层面上的调用。其实语言层里面的调用里面都封装着系统级别的调用。

四、文件描述符

文件描述符是一个非负整数,它是 Linux 内核为了管理文件操作而给每个打开的文件或其他 I/O 资源(如管道、套接字等)分配的一个标识符。可以将其理解为一个指向内核中代表打开文件的数据结构的索引,通过这个索引,程序能够方便地对相应的文件或资源进行各种读写等操作。

在操作系统层面接口层面,系统只认文件描述符(fd)。所有根据前面所讲,语言层面肯定封装了文件fd。

int main()
{printf("stdin: %d\n",stdin->_fileno);printf("stdout: %d\n",stdout->_fileno);printf("stderr: %d\n",stderr->_fileno);int fd1=open("log.txt",O_CREAT | O_WRONLY | O_TRUNC ,0666);int fd2=open("log2.txt",O_CREAT | O_WRONLY | O_TRUNC ,0666);int fd3=open("log3.txt",O_CREAT | O_WRONLY | O_TRUNC ,0666);int fd4=open("log4.txt",O_CREAT | O_WRONLY | O_TRUNC ,0666);if(fd1<0) exit(1);if(fd2<0) exit(1);if(fd3<0) exit(1);if(fd4<0) exit(1);printf("fd1 : %d\n",fd1);printf("fd2 : %d\n",fd2);printf("fd3 : %d\n",fd3);printf("fd4 : %d\n",fd4);close(fd1);close(fd2);close(fd3);close(fd4);
}

在这里插入图片描述
看上面代码,普通进行系统层面的文件操作比如用系统接口进行读操作写操作等,文件描述符是从3开始的。但是语言层面的标准输入标准输出标准错误,是从0-2。(当然其他语言的也是这样)

在这里插入图片描述
文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示⼀个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有⼀个指针*files, 指向⼀张表files_struct,该表最重要的部分就是包含⼀个指针数组,每个元素都是⼀个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应文件。

文件描述符的分配规则

int main()
{umask(0);int fd=open("log.txt",O_CREAT | O_WRONLY | O_TRUNC ,0666);if(fd<0){perror("open");return 1;}printf("fd:%d\n",fd);close(fd);return 0;}

在这里插入图片描述
正常情况打开,一个文件。文件描述符从3开始。


关闭files_sructs数组0下标位置,发现打开文件描述符下标位置为0。

int main()
{umask(0);close(0);int fd=open("log.txt",O_CREAT | O_WRONLY | O_TRUNC ,0666);if(fd<0){perror("open");return 1;}printf("fd:%d\n",fd);close(fd);return 0;}

在这里插入图片描述


通过上面示例发现,在files_struct数组中,找到当前没有使用的最小的一个位置的小标,作为新的文件描述符的位置。

重谈重定向

上面谈过,echo重定向本质是通过语言层面进行文件操作把内容写进文件。从上面也知道语言层面的接口都封装系统层面的调用。下面谈一谈系统层面是如何进行重定向的。

最小的没有被使用的fd,最为新的fd分配给用户。

在这里插入图片描述
当我们把fd下标为2,标准输出的位置关了,我们文件的内容的fd会自动分配到下标为2位置。

使用dup2系统调用
在这里插入图片描述

int main() {// 打开文件,如果文件不存在则创建,同时以读写模式打开int fd = open("./log", O_CREAT | O_RDWR);if (fd < 0) {perror("open");return 1;}// 关闭标准输出文件描述符close(1);// 将文件描述符 fd 复制到标准输出文件描述符(1)dup2(fd, 1);for (;;) {char buf[1024] = {0};// 从标准输入读取数据到缓冲区ssize_t read_size = read(0, buf, sizeof(buf) - 1);if (read_size < 0) {perror("read");break;}// 输出读取到的内容printf("%s", buf);// 刷新标准输出缓冲区fflush(stdout);}return 0;
}

标准错误

向标准输出和标准错误里打信息
在这里插入图片描述
标准输出和标准错误都是显示器文件,想把标准输出和标准错误的信息重定向一个文件。这样是不行的。可以发现两者在两个文件中
在这里插入图片描述
用下面这个指令进行重定向,重定向到了两个文件
在这里插入图片描述
用下面这个指令可以把两者重定向到一个文件
在这里插入图片描述

为什么存在一个标准错误呢?可以通过重定向能力把常规消息和错误消息进行分离。以方便后续用户进行操作好区分。

http://www.dtcms.com/wzjs/154903.html

相关文章:

  • 柳州高端网站建设域名注册时间查询
  • 安徽房和城乡建设部网站什么叫口碑营销
  • 淘宝二官方网站是做啥的短视频seo搜索优化
  • 龙岗龙城街道网站建设18款禁用看奶app入口
  • 福永镇网站建设免费快速网站
  • 定州建设厅网站软文营销文章
  • 装饰公司怎么做网站网络优化工程师吃香吗
  • 专业网站的建设设行吗品牌营销策划培训课程
  • 网站建设怎么样工作贵州二级站seo整站优化排名
  • 手机网站模板用什么做深圳网络推广最新招聘
  • 建设网站杭州营销推广的工具有哪些
  • 欧美风格网站设计百度搜索引擎推广收费标准
  • 百度包头网站建设上海网络营销seo
  • 中山网站建设解决方案seo网络优化前景怎么样
  • 西安定制网站建设石家庄今日头条新闻
  • 德惠市住房城乡建设委官方网站产品策划推广方案
  • 网站建设视屏教程快速收录工具
  • 昆山网站优化建设宁德市中医院
  • 网站设计制作什么时候好开网店如何运营和推广
  • 7款优秀网站设计欣赏百度云官网
  • 动态网站代做抖音关键词排名优化
  • 游戏网站建设方案找关键词
  • 黄浦品牌网站建设谷歌网址
  • 网监关闭的网站怎么恢复培训心得体会范文大全2000字
  • 从零精通网站建设重庆网站seo多少钱
  • 网站建设方案书是啥正规网络推广服务
  • 详情页设计素材seo包括什么
  • 乌鲁木做兼职的网站域名查询网入口
  • wordpress点击分类目录空白整站优化系统
  • 微信认证 网站山东做网站公司