【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 } 

相关文章:
【Linux】基础IO
目录 一、回顾C语言文件操作二、文件系统调用接口1. open2.write3.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 //…...
【Go 基础篇】深入探索:Go语言中的二维数组
在计算机编程中,数组是一种基本的数据结构,用于存储相同类型的元素。而二维数组作为数组的一种扩展,允许我们以类似表格的方式存储和处理数据。在Go语言中,二维数组是一个重要的概念,本文将深入探讨Go语言中的二维数组…...
IntelliJ IDEA 2023.2.1使用Git时弹出“使用访问令牌登录”问题解决
这里写目录标题 一、内网Git环境GitLabGogsGitea 二、外网Git环境GitHubGitee 升级为IntelliJ IDEA 2023.2.1后,使用Git时弹出“使用访问令牌登录”的窗口,习惯使用Git帐号密码登录的用户,面对这个突如其来的弹窗真的很懵。 一、内网Git环境 …...
前端开发学习路线
无前端基础学习路线: B站免费视频1 B站免费视频2 有HTML、CSS、JavaScript基础,可直接通过以上视频中Vue2Vue3中实战项目学习Vue。...
1、英飞凌-AURIX-TC297简介
目录 TC297简介TC297特点:系统优势最具创新性的安全应用场景 printf("欢迎关注公众号:Kevin的学习站/车载嵌入式探索者,博主建立了一个车规级开发交流群, 感兴趣的朋友可以关注公众号,加个人WX:_kevin…...
Android 音频框架 基于android 12
文章目录 前言音频服务audioserver音频数据链路hal 提供什么样的作用 前言 Android 的音频是一个相当复杂的部分。从应用到框架、hal、kernel、最后到硬件,每个部分的知识点都相当的多。而android 这部分代码在版本之间改动很大、其中充斥着各种workaround的处理&a…...
项目实践:类平面抓取点计算(占位,后面补充)
文章目录 文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_...
中央空调秒变智能 青岛中弘P15面板式空调网关初体验
在智能家居逐步渗透进千家万户的今天,如何将中央空调融入到智能化场景,以实现场景联动、提升家居生活的智能化和科技化程度,中弘给出了新的答案。本期智哪儿就带大家测评一下青岛中弘P15面板式空调网关,一起看看它的价值所在。 高…...
vue create -p dcloudio/uni-preset-vue my-project创建文件报错443
因为使用vue3viteuniappvant4报错,uniapp暂不支持vant4,所以所用vue2uniappvant2 下载uni-preset-vue-master 放到E:\Auniapp\uni-preset-vue-master 在终端命令行创建uniapp vue create -p E:\Auniapp\uni-preset-vue-master my-project...
本地电脑搭建Plex私人影音云盘教程,内网穿透实现远程访问
文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语6 总结 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特…...
CI/CD 持续集成 持续交付
CI(Continuous integration)持续集成 参考:https://www.jianshu.com/p/2132949ff84a 持续集成是指多名开发者在开发不同功能代码的过程当中,可以频繁的将代码行合并到一起并切相互不影响工作。 持续集成的目的,是让…...
《Go 语言第一课》课程学习笔记(十一)
控制结构 if 的“快乐路径”原则 针对程序的分支结构,Go 提供了 if 和 switch-case 两种语句形式;而针对循环结构,Go 只保留了 for 这一种循环语句形式。 if 语句 if 语句是 Go 语言中提供的一种分支控制结构,它也是 Go 中最常…...
C++--完全背包问题
1.【模板】完全背包_牛客题霸_牛客网 你有一个背包,最多能容纳的体积是V。 现在有n种物品,每种物品有任意多个,第i种物品的体积为vivi ,价值为wiwi。 (1)求这个背包至多能装多大价值的物品? ࿰…...
显示本地 IP 地址和相应的 QR 码,方便用户共享和访问网络信息
这段代码使用了 wxPython、socket、qrcode 和 PIL(Python Imaging Library)模块来生成一个具有本地 IP 地址和相应 QR 码的窗口应用程序。 C:\pythoncode\new\showipgenqrcode.py 让我们逐行解释代码的功能: import wx:导入 wx…...
为什么建议同时学多门编程语言
晨读一本名叫《4点起床》的书,书中有一段描述与最近学习编制语言时自己的感受完全一致。算是一个小经验,分享给大家。 书中有一章的标题为《同时学六国语言记起来比较快》,其中有两段描述如下: 为什么我推荐大家同时学不同的语言…...
langchain agent
zero-shot-react-description 代码 from langchain.agents import initialize_agent from langchain.llms import OpenAI from langchain.tools import BaseTool import os os.environ[OPENAI_API_KEY]"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"# 搜索…...
Zabbix下载安装及SNMP Get使用
帮助文档:6. Zabbix Appliance 一、zabbix下载安装 1、获取Zabbix Appliance镜像 Download Zabbix appliance 2、使用该镜像创建虚拟机 3、打开虚拟机控制台自动安装,等待安装完成即可 默认配置 系统/数据库:root:zabbix Zabbix 前端&am…...
freee Programming Contest 2023(AtCoder Beginner Contest 310)
文章目录 A - Order Something Else(模拟)B - Strictly Superior(模拟)C - Reversible(模拟)D - Peaceful Teams(DFS状压)E - NAND repeatedly(普通dp)F - Make 10 Again(状态压缩概率dp&#x…...
恒运资本:概念股是什么意思
概念股是指在特定的经济布景、方针环境、职业远景或社会热点等方面具有某种特别的发展远景和投资价值的股票。在投资者心目中,概念股的危险较大,可是或许带来高于商场平均水平的收益率。那么,概念股到底是什么意思?在本文中&#…...
十九、状态模式
一、什么是状态模式 状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。 状态模式包含以下主要角色: 环境类(…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...


系统的标准输入,标准输出和标准错误占据了数组的前三个位置,所以我们进程在打开文件的时候,默认文件描述符就是从3开始。


