【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); // 以只写方式打开,如果没有该文件就创建,权限为666if(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     else26     {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 }

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django实现音乐网站 ⒁

使用Python Django框架制作一个音乐网站&#xff0c; 本篇主要是歌手页-全部歌手页功能开发。 目录 分出首页样式内容 创建首页样式文件 首页引入样式文件 全部歌手列表 创建路由 显示视图 引入分页实现库 视图方法 创建歌手首页 增加歌手跳转 导航条改活 首页增加…

xss-labs靶场通关详解

文章目录 前言level1level2level3level4level5level6level7level8level9level10level11level12level13level14level15level16level17level18level19&level20 前言 赶着假期结尾的时候&#xff0c;赶紧给自己找点任务做。现在对xss还是一知半解&#xff0c;只是了解个大概&a…

React面向组件编程

往期回顾&#xff1a;# React基础入门之虚拟Dom【一】 面向组件编程 react是面向组件编程的一种模式&#xff0c;它包含两种组件类型&#xff1a;函数式组件及类式组件 函数式组件 注&#xff1a;react17开始&#xff0c;函数式组件成为主流 一个基本的函数组件长这个样子 …

几种在JavaScript中创建对象的方式!

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 字面量方式⭐ 构造函数方式⭐ Object.create()方式⭐ 工厂函数方式⭐ ES6类方式⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门…

不同规模的测试团队分别适合哪些测试用例管理工具?测试用例管理工具选型指南

随着软件系统规模的持续增大&#xff0c;业务复杂度的持续增加&#xff0c;软件测试的复杂度也随之越来越大。软件测试工作的复杂性主要体现在测试用例的编写、维护、执行和管理方面。而创建易于阅读、维护和管理的测试用例能够显著减轻测试工作的复杂性。 本篇文章将较为系统的…

Websocket、SessionCookie、前端基础知识

目录 1.Websocket Websocket与HTTP的介绍 不同使用场景 Websocket链接过程 2.Session&Cookie Cookie的工作原理 Session的工作原理 区别 3.前端基础知识 1.Websocket Websocket与HTTP的介绍 HTTP&#xff1a; 1.HTTP是单向的&#xff0c;客户端发送请求&#xff0…

论文解读 | OmniObject3D:用于逼真感知、重建和生成的大词汇量3D对象数据集

原创 | 文 BFT机器人 这篇论文的主要目标是介绍和探索OmniObject3D数据集&#xff0c;该数据集包含大量真实扫描的3D物体&#xff0c;涵盖了190个类别&#xff0c;提供了多种丰富的注释&#xff0c;包括纹理3D网格、采样点云、多视图图像等。作者将OmniObject3D应用于多个3D视…

2023年IT服务行业研究报告

第一章 行业概况 1.1 定义 IT服务行业是一个广泛的术语&#xff0c;涵盖了所有提供技术支持和服务的公司。这些服务包括系统集成&#xff0c;云计算服务&#xff0c;软件和硬件支持&#xff0c;网络服务&#xff0c;咨询服务&#xff0c;以及一系列其他类型的技术服务。此外&…

DNS指向别名还是IP

现在有一台服务器dbprod126&#xff0c;ip是172.22.100.4 现在有一个需求&#xff0c;需要在dns中对dbprod126建一个别名wondadb3r的记录&#xff0c;也就是ping wondadb3r的时候显示的是dbprod126的ip&#xff0c;目前有两​种方法&#xff0c;主要使用方法1指向别名&#xf…

LNMP 平台搭建(四十)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 搭建LNMP 一、安装Nginx 二、安装Mysql 三、安装PHP 四、部署应用 前言 LNMP平台指的是将Linux、Nginx、MySQL和PHP&#xff08;或者其他的编程语言&#xff0c;如…

RK3588开发板编译环境Ubuntu20.04编译配置增加交换内存

迅为提供的编译环境 Ubuntu20.04 默认配置了交换内存是 9G&#xff0c;如果在编译过程中&#xff0c;因内 存不够而编译报错&#xff0c;可以参考本小节进行设置。 这里举例分配 5G 交换内存。 在开始之前&#xff0c;使用命令检查一下您的 ubuntu 的 swap 分区。 sudo swa…

Postgresql的一个bug_涉及归档和pg_wal

故障描述&#xff1a; 服务器ocmpgdbprod1&#xff0c;是流复制主节点&#xff0c;它的从节点是ocmpgdbprod2&#xff0c;两个节点的Postgresql数据库版本都是PostgreSQL 11.6&#xff0c;主节点ocmpgdbprod1配置了pg_wal归档&#xff0c;从节点ocmpgdbprod2没有配置pg_wal归档…