【Linux】基础IO

目录

  • 一、回顾C语言文件操作
  • 二、文件系统调用接口
    • 1. open
    • 2.write
    • 3.read
  • 三、文件描述符
  • 四、重定向
    • 1.输出重定向
    • 2.输入重定向
  • 五、dup2

一、回顾C语言文件操作

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 #define LOG "log.txt"
  5 
  6 int main()
  7 {
  8   //w 默认写方式打开文件,如果文件不在,就创建它
  9   //默认如果是打开,内容会被自动清空
 10   //同时,每次进行写入的时候,都会从最开始写入
 11   FILE* fp=fopen(LOG,"w");  //"r"只读 ,"a"追加
 12   if(fp==NULL)
 13   {
 14     perror("fopen");  //判断是否创建成功
 15     return 1;
 16   }
 17 
 18   //文件打开成功,进行文件操作
 19   const char* msg="hello linux!";
 20   int cnt=5;
 21   while(cnt)
 22   {
 23     fprintf(fp,"%s: %d: tzc\n",msg,cnt);  //打印到文件中 
 24     //fprintf(stdout,"%s: %d: tzc\n",msg,cnt);  //stdout 打印到显示器文件中                           
 25     //fputs(msg,fp);
 26     cnt--;
 27   }
 28   fclose(fp);  //关闭文件
 29 
 30   return 0;
 31 }

在这里插入图片描述

  C语言有三个默认输入输出流,分别是 stdin,stdout,stderr.将他们分别称为:标准输入,标准输出,标准错误;他们分别对应 键盘、显示器、显示器。

在这里插入图片描述

代码

#include<stdio.h>
 
int main()
{ 
    const char* str = "hello wrold!\n";
    fputs(str,stdout); // 向标准输出中打印,即打印在显示器上
    fputs(str,stdout);
    fputs(str,stdout);
}

运行结果
在这里插入图片描述

二、文件系统调用接口

1. open

在这里插入图片描述

open打开文件后会返回一个文件描述符,用来后续进行文件操作

#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
 
int main()
{
    umask(0); // 防止umask码&设置权限,影响期望权限
    int fd = open("./log.txt",O_WRONLY|O_CREAT,0666); // 以只写方式打开,如果没有该文件就创建,权限为666
    if(fd<0) // 打开失败
    {
        perror("open");
        return 1;
    }
 
    close(fd);
    return 0;
}

在这里插入图片描述

2.write

在这里插入图片描述

第一个参数是需要填写文件描述符,需要操作哪一个文件就将哪一个文件的文件描述符填到第一个参数,第二个参数是要写入的内容,第三个参数是写入的大小
返回值:返回值为实际写入文件数据大小。

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/stat.h>
  4 #include<sys/types.h>
  5 #include<fcntl.h>
  6 #include<string.h>
  7 
  8 int main()
  9 {
 10     int fd = open("./log.txt",O_WRONLY|O_CREAT,0644);
 11     if(fd<0)
 12     {
 13         perror("open");
 14         return 1;
 15     }
 16 
 17     const char* msg = "hello linux!\n";
 18     int count = 5;
 19     while(count--)
 20     {
 21         char line[256]; //缓存数组
 22         snprintf(line,sizeof(line),"%s, %d\n",msg,count); //写入line                                                                                                 
 23         write(fd, msg,strlen(msg));// 写入时不需要写入'\0',字符串以'\0'结束只是C语言的规定,文件中字符串不需要'\0'
 24     }
 25     close(fd);
 26     return 0;
 27 }

在这里插入图片描述

3.read

在这里插入图片描述

第一个参数是文件描述符,第二个参数是读取到哪个位置,第三个参数是读取多大
需要注意的是读取的时候直接全文进行读取,不会按行读取。

  1 #include<stdio.h>                                                                                                                                                    
  2 #include<unistd.h>
  3 #include<sys/stat.h>
  4 #include<sys/types.h>
  5 #include<fcntl.h>
  6 #include<string.h>
  7 
  8 
  9 int main()
 10 {
 11     int fd = open("./log.txt",O_RDONLY);
 12     if(fd<0)
 13     {
 14         perror("open");
 15         return 1;
 16     }
 17 
 18     char buf[1024];
 19     ssize_t s = read(fd, buf, sizeof(buf)-1);// 将文件内容读出,需将字符串末尾加'\0'
 20     if(s>0)
 21     {
 22         buf[s] = 0;
 23         printf("%s\n",buf); //将读取到的字符串打印出来
 24     }
 25     else
 26     {
 27         printf("read failed\n");
 28     }
 29     return 0;
 30 }

在这里插入图片描述

三、文件描述符

文件描述符就是调用系统接口open的返回值,打开成功返回该文件的文件描述符,打开失败返回-1。

#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
 
 
int main()
{
    int fd1 = open("./log.txt",O_WRONLY|O_CREAT,0644);
    int fd2 = open("./log.txt",O_WRONLY|O_CREAT,0644);
    int fd3 = open("./log.txt",O_WRONLY|O_CREAT,0644);
    int fd4 = open("./log.txt",O_WRONLY|O_CREAT,0644);
 
    printf("fd1: %d\n",fd1);
    printf("fd2: %d\n",fd2);
    printf("fd3: %d\n",fd3);
    printf("fd4: %d\n",fd4);
    return 0;
}

在这里插入图片描述

实际上文件描述符就是一个数组的下标,如何理解?
在这里插入图片描述系统的标准输入,标准输出和标准错误占据了数组的前三个位置,所以我们进程在打开文件的时候,默认文件描述符就是从3开始。

如何验证?
在这里插入图片描述

四、重定向

1.输出重定向

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/stat.h>
  4 #include<sys/types.h>
  5 #include<fcntl.h>
  6 #include<string.h>
  7  
  8 int main()
  9 {
 10     close(1); // 关闭标准输出
 11     int fd = open("./log.txt", O_WRONLY|O_CREAT|O_TRUNC,0644);
 12     // int fd = open("./log.txt", O_WRONLY|O_CREAT|O_APPEND,0644); // 追加重定向 只是换成append       
 13     if(fd<0)
 14     {                                                                                     
 15        perror("open");                                                                    
 16        return 1;                                                                          
 17     }                                                                                     
 18                                                                                           
 19     int count = 5;                                                                        
 20     while(count--)                                                                        
 21     {                                                                                     
 22         printf("hello world!\n");                                                         
 23     }                                                                                     
 24                                                                                           
 25     return 0;                                                                             
 26 } 

在这里插入图片描述

原理:

在这里插入图片描述

2.输入重定向

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/stat.h>
  4 #include<sys/types.h>
  5 #include<fcntl.h>
  6 #include<string.h>
  7 
  8 int main()
  9 {
 10     close(0); // 关闭标准输入
 11     int fd = open("./log.txt", O_RDONLY);
 12     if(fd<0)
 13     {
 14        perror("open");
 15        return 1;                                                                                      
 16     }
 17 
 18     int a,b;
 19     scanf("%d %d",&a,&b);
 20     printf("a=%d, b=%d\n",a,b);
 21 
 22     return 0;
 23 }

在这里插入图片描述

原理跟输出重定向相同,不过要关闭的是stdin

除了代码方式,我们可以通过指令方式进行重定向

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/stat.h>
  4 #include<sys/types.h>
  5 #include<fcntl.h>
  6 #include<string.h>
  7 
  8 int main()
  9 {
 10     printf("you can see me!\n");
 11     printf("you can see me!\n");
 12     printf("you can see me!\n");
 13     printf("you can see me!\n");
 14 
 15     fprintf(stdout,"hello linux!\n");
 16     fprintf(stdout,"hello linux!\n");
 17     fprintf(stdout,"hello linux!\n");
 18 
 19     fprintf(stderr,"hello tzc!\n");
 20     fprintf(stderr,"hello tzc!\n");                                                                                                                                                        
 21     fprintf(stderr,"hello tzc!\n");
 22 
 23 
 24     return 0;
 25 }

在这里插入图片描述

将原本输出到显示器文件中的数据重定向到log.txt中,重定向stdout的内容,所以stderr中的内容还是被打印到显示器文件中了

如果要对标准错误(stderr)的内容重定向到文件中可以另加修饰。
在这里插入图片描述
此时我们可以看到标准错误和标准输出都打印到同一个文件中。
也可以进行分开重定向
在这里插入图片描述

五、dup2

我们发现在对数据进行重定向的时候,操作比较复杂,系统提供了一个函数用来简化重定向操作
在这里插入图片描述

dup2有两个参数,oldfd和newfd,他的底层原理实际是将newfd的指针覆盖,换成指定oldfd位置的指针

使用:

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/stat.h>
  4 #include<sys/types.h>
  5 #include<fcntl.h>
  6 #include<string.h>
  7 
  8 #define LOG "log.txt"
  9 
 10 int main()
 11 {
 12     int fd=open(LOG,O_WRONLY|O_CREAT|O_TRUNC,0666); //打开文件
 13     if(fd==-1)
 14     {
 15         perror("open");
 16         return -1;
 17     }
 18 
 19     dup2(fd,1); //将下标为1位置的内容覆盖为fd位置下标中内容
 20 
 21     printf("hello linux!\n");
 22     printf("hello linux!\n");
 23     printf("hello linux!\n");                                                                                                                                                              
 24 
 25     return 0;
 26 }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/97985.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nacos闪退等环境问题解决

nacos闪退&#xff1a;通常是jdk环境变量配置有问题&#xff0c;nacos获取不到环境变量所以闪退。因为nacos的启动文件会获取JAVA_HOME&#xff0c;如果配置的不对&#xff0c;会直接闪退。如图所示&#xff0c;nacos启动文件最开始就是获取环境变量&#xff0c;获取不到就提示…

7.Redis-list

list list常用命令lpushlrangelpushxrpushrpushxlpop / rpoplindexlinsertllenlremltrimlset 阻塞版本命令blpop/brpop 总结内部编码应用场景使用redis作为消息队列 redis中的 list 是一个双端队列, list 相当于是数组或者顺序表。list 并非是一个简单的数组&#xff0c;而是更…

宠物赛道,用AI定制宠物头像搞钱项目教程

今天给大家介绍一个非常有趣&#xff0c;而粉丝价值又极高&#xff0c;用AI去定制宠物头像或合照的AI项目。 接触过宠物行业应该知道&#xff0c;获取1位铲屎官到私域&#xff0c;这类用户的价值是极高的&#xff0c;一个宠物粉&#xff0c;是连铲个屎都要花钱的&#xff0c;每…

context.WithCancel()的使用

“ WithCancel可以将一个Context包装为cancelCtx,并提供一个取消函数,调用这个取消函数,可以Cancel对应的Context Go语言context包-cancelCtx[1] 疑问 context.WithCancel()取消机制的理解[2] 父母5s钟后出门&#xff0c;倒计时&#xff0c;父母在时要学习&#xff0c;父母一走…

计算机视觉的应用12-卷积神经网络中图像特征提取的可视化研究,让大家理解特征提取的全过程

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用12-卷积神经网络中图像特征提取的可视化研究&#xff0c;让大家理解特征提取的全过程。 要理解卷积神经网络中图像特征提取的全过程&#xff0c;我们可以将其比喻为人脑对视觉信息的处理过程。就像…

qt day

#include "widget.h" #include "ui_widget.h" void Widget::my_slot() {} Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setWindowIcon(QIcon(":/wodepeizhenshi.png"));//設置窗口的…

数据结构(Java实现)-二叉树(上)

树型结构 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff0c;称为根结点&…

docker高级(DockerFile解析)

1、构建三步骤 编写Dockerfile文件 docker build命令构建镜像 docker run依镜像运行容器实例 2、DockerFile构建过程解析 Dockerfile内容基础知识 1&#xff1a;每条保留字指令都必须为大写字母且后面要跟随至少一个参数 2&#xff1a;指令按照从上到下&#xff0c;顺序执行…

编程题四大算法思想(二)——回溯法:N皇后问题、子集和问题、地图填色问题、迷宫问题

文章目录 回溯法迷宫游戏 N皇后问题基本概念解空间4后问题的解空间 可行解和最优解回溯法回溯法术语回溯法的关键问题回溯法的基本思想4后问题的约束条件n后问题生成问题状态的基本方法 子集和问题一个朴素的求解方法回溯回溯法的剪枝技术 地图填色问题 回溯法 迷宫游戏 深度优…

springcloud-gateway简述

Spring Cloud Gateway 是一个用于构建 API 网关的项目&#xff0c;它是 Spring Cloud 生态系统中的一部分&#xff0c;旨在为微服务架构提供动态路由、负载均衡、安全性和监控等功能。 网关工程对应pom文件 <?xml version"1.0" encoding"UTF-8"?>…

HTTP状态码504(Gateway Timeout)报错原因分析和解决办法

文章目录 504报错原因分析一、用户角度1. 代理服务器问题2. 网络问题 二、网站管理员角度1. 服务器负载过重2. 网关配置问题3. 目标服务器响应慢4. IIS/nginx/apache服务关闭5. 维护或故障6. 数据库的慢处理也会导致504 用户角度可以采取哪些措施解决504错误1. 刷新页面2. 检查…

SQLI-labs-第一关

目录 知识点&#xff1a;单引号字符型注入 1、根据提示&#xff0c;为get注入&#xff0c;在url中输入内容​编辑 2、判断注入点 3、判断目前该表的字段数 4、判断回显位置 5、爆库名 6、爆表名 7、爆字段名 8、爆值 知识点&#xff1a;单引号字符型注入 思路&#xff1a;…

matlab使用教程(26)—常微分方程的求解

1.求解非刚性 ODE 本页包含两个使用 ode45 来求解非刚性常微分方程的示例。MATLAB 提供几个非刚性 ODE 求解器。 • ode45 • ode23 • ode78 • ode89 • ode113 对于大多数非刚性问题&#xff0c;ode45 的性能最佳。但对于允许较宽松的误差容限或刚度适中的问题&…

FI 数据源(AP) 及 增量逻辑

AP 一般AP里要分析行项目数据&#xff0c;交易数据&#xff0c;历史付款信息。 还有一些供应商主数据。 基础的抽取数据源就是下面几个&#xff1a; 0FI_AP_4: Vendors: Line Items with Delta Extrcation0FI_AP_6: Vendor Sales Figures via Delta Extraction0FI_AP_7: Ve…

小白到运维工程师自学之路 第八十集 (Jumpserver堡垒机管理)2

5、登录普通用户进行测试 这里的操作和在linux系统中的终端操作一样 在Xshell中登录 创建一个普通文件 在web终端中查看 五、审计台 在审计台中可以看到服务器的各种详细操作 在这里可以看到哪个用户在哪个时间对服务器具体使用了什么命令&#xff0c;还可以看到录频回放。 …

windows使用技巧

1、windows 快捷键 winM&#xff1a;所有页面最小化 winD&#xff1a;快速到达桌面 winE&#xff1a;打开我的电脑 winV&#xff1a;剪切板记录 win&#xff0c;&#xff1a;查看桌面&#xff08;松开恢复原样&#xff09; winW&#xff1a;全屏截屏 winR&#xff1a;快速运行…

实现不同局域网文件共享的解决方案:使用Python自带HTTP服务和端口映射

文章目录 1. 前言2. 本地文件服务器搭建2.1 python的安装和设置2.2 cpolar的安装和注册 3. 本地文件服务器的发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有广泛的应用…

交换机端口安全

文章目录 一、802.1X认证1. 定义和起源2. 认证方式本地认证远程集中认证 3. 端口接入控制方式基于端口认证基于MAC地址认证 二、端口隔离技术1. 隔离组2. 隔离原理3. 应用场景 首先可以看下思维导图&#xff0c;以便更好的理解接下来的内容。 一、802.1X认证 1. 定义和起源 8…

Vector<T> 动态数组(模板语法)

C数据结构与算法 目录 本文前驱课程 1 C自学精简教程 目录(必读) 2 动态数组 Vector&#xff08;难度1&#xff09; 其中&#xff0c;2 是 1 中的一个作业。2 中详细讲解了动态数组实现的基本原理。 本文目标 1 学会写基本的C类模板语法&#xff1b; 2 为以后熟练使用 S…

深度学习8:详解生成对抗网络原理

目录 大纲 生成随机变量 可以伪随机生成均匀随机变量 随机变量表示为操作或过程的结果 逆变换方法 生成模型 我们试图生成非常复杂的随机变量…… …所以让我们使用神经网络的变换方法作为函数&#xff01; 生成匹配网络 培养生成模型 比较基于样本的两个概率分布 …