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

【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语言中的二维数组

在计算机编程中&#xff0c;数组是一种基本的数据结构&#xff0c;用于存储相同类型的元素。而二维数组作为数组的一种扩展&#xff0c;允许我们以类似表格的方式存储和处理数据。在Go语言中&#xff0c;二维数组是一个重要的概念&#xff0c;本文将深入探讨Go语言中的二维数组…...

IntelliJ IDEA 2023.2.1使用Git时弹出“使用访问令牌登录”问题解决

这里写目录标题 一、内网Git环境GitLabGogsGitea 二、外网Git环境GitHubGitee 升级为IntelliJ IDEA 2023.2.1后&#xff0c;使用Git时弹出“使用访问令牌登录”的窗口&#xff0c;习惯使用Git帐号密码登录的用户&#xff0c;面对这个突如其来的弹窗真的很懵。 一、内网Git环境 …...

前端开发学习路线

无前端基础学习路线&#xff1a; B站免费视频1 B站免费视频2 有HTML、CSS、JavaScript基础&#xff0c;可直接通过以上视频中Vue2Vue3中实战项目学习Vue。...

1、英飞凌-AURIX-TC297简介

目录 TC297简介TC297特点&#xff1a;系统优势最具创新性的安全应用场景 printf("欢迎关注公众号&#xff1a;Kevin的学习站/车载嵌入式探索者&#xff0c;博主建立了一个车规级开发交流群&#xff0c; 感兴趣的朋友可以关注公众号&#xff0c;加个人WX&#xff1a;_kevin…...

Android 音频框架 基于android 12

文章目录 前言音频服务audioserver音频数据链路hal 提供什么样的作用 前言 Android 的音频是一个相当复杂的部分。从应用到框架、hal、kernel、最后到硬件&#xff0c;每个部分的知识点都相当的多。而android 这部分代码在版本之间改动很大、其中充斥着各种workaround的处理&a…...

项目实践:类平面抓取点计算(占位,后面补充)

文章目录 文章目录&#xff1a;3D视觉个人学习目录微信&#xff1a;dhlddxB站: Non-Stop_...

中央空调秒变智能 青岛中弘P15面板式空调网关初体验

在智能家居逐步渗透进千家万户的今天&#xff0c;如何将中央空调融入到智能化场景&#xff0c;以实现场景联动、提升家居生活的智能化和科技化程度&#xff0c;中弘给出了新的答案。本期智哪儿就带大家测评一下青岛中弘P15面板式空调网关&#xff0c;一起看看它的价值所在。 高…...

vue create -p dcloudio/uni-preset-vue my-project创建文件报错443

因为使用vue3viteuniappvant4报错&#xff0c;uniapp暂不支持vant4&#xff0c;所以所用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.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特…...

CI/CD 持续集成 持续交付

CI&#xff08;Continuous integration&#xff09;持续集成 参考&#xff1a;https://www.jianshu.com/p/2132949ff84a 持续集成是指多名开发者在开发不同功能代码的过程当中&#xff0c;可以频繁的将代码行合并到一起并切相互不影响工作。 持续集成的目的&#xff0c;是让…...

《Go 语言第一课》课程学习笔记(十一)

控制结构 if 的“快乐路径”原则 针对程序的分支结构&#xff0c;Go 提供了 if 和 switch-case 两种语句形式&#xff1b;而针对循环结构&#xff0c;Go 只保留了 for 这一种循环语句形式。 if 语句 if 语句是 Go 语言中提供的一种分支控制结构&#xff0c;它也是 Go 中最常…...

C++--完全背包问题

1.【模板】完全背包_牛客题霸_牛客网 你有一个背包&#xff0c;最多能容纳的体积是V。 现在有n种物品&#xff0c;每种物品有任意多个&#xff0c;第i种物品的体积为vivi​ ,价值为wiwi​。 &#xff08;1&#xff09;求这个背包至多能装多大价值的物品&#xff1f; &#xff0…...

显示本地 IP 地址和相应的 QR 码,方便用户共享和访问网络信息

这段代码使用了 wxPython、socket、qrcode 和 PIL&#xff08;Python Imaging Library&#xff09;模块来生成一个具有本地 IP 地址和相应 QR 码的窗口应用程序。 C:\pythoncode\new\showipgenqrcode.py 让我们逐行解释代码的功能&#xff1a; import wx&#xff1a;导入 wx…...

为什么建议同时学多门编程语言

晨读一本名叫《4点起床》的书&#xff0c;书中有一段描述与最近学习编制语言时自己的感受完全一致。算是一个小经验&#xff0c;分享给大家。 书中有一章的标题为《同时学六国语言记起来比较快》&#xff0c;其中有两段描述如下&#xff1a; 为什么我推荐大家同时学不同的语言…...

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使用

帮助文档&#xff1a;6. Zabbix Appliance 一、zabbix下载安装 1、获取Zabbix Appliance镜像 Download Zabbix appliance 2、使用该镜像创建虚拟机 3、打开虚拟机控制台自动安装&#xff0c;等待安装完成即可 默认配置 系统/数据库&#xff1a;root:zabbix Zabbix 前端&am…...

freee Programming Contest 2023(AtCoder Beginner Contest 310)

文章目录 A - Order Something Else&#xff08;模拟&#xff09;B - Strictly Superior&#xff08;模拟&#xff09;C - Reversible&#xff08;模拟&#xff09;D - Peaceful Teams(DFS状压)E - NAND repeatedly(普通dp)F - Make 10 Again&#xff08;状态压缩概率dp&#x…...

恒运资本:概念股是什么意思

概念股是指在特定的经济布景、方针环境、职业远景或社会热点等方面具有某种特别的发展远景和投资价值的股票。在投资者心目中&#xff0c;概念股的危险较大&#xff0c;可是或许带来高于商场平均水平的收益率。那么&#xff0c;概念股到底是什么意思&#xff1f;在本文中&#…...

十九、状态模式

一、什么是状态模式 状态&#xff08;State&#xff09;模式的定义&#xff1a;对有状态的对象&#xff0c;把复杂的“判断逻辑”提取到不同的状态对象中&#xff0c;允许状态对象在其内部状态发生改变时改变其行为。 状态模式包含以下主要角色&#xff1a; 环境类&#xff08…...

Go 协程池任务调度架构

Go 协程池任务调度架构&#xff1a;高并发任务的智慧引擎 在现代高并发编程中&#xff0c;Go语言的协程&#xff08;goroutine&#xff09;以其轻量级和高效性成为开发者的首选。无限制地创建协程可能导致资源耗尽&#xff0c;而协程池&#xff08;goroutine pool&#xff09;…...

React-primitives项目架构剖析:模块化设计与依赖注入原理

React-primitives项目架构剖析&#xff1a;模块化设计与依赖注入原理 【免费下载链接】react-primitives Primitive React Interfaces Across Targets 项目地址: https://gitcode.com/gh_mirrors/re/react-primitives React-primitives是一个跨平台UI开发框架&#xff0…...

GPEN快速上手教程:手机自拍模糊修复,30秒获取高清证件照

GPEN快速上手教程&#xff1a;手机自拍模糊修复&#xff0c;30秒获取高清证件照 你是不是也遇到过这种情况&#xff1a;急着要用证件照&#xff0c;翻遍手机相册却发现每张自拍都模糊不清&#xff1f;要么是光线太暗&#xff0c;要么是手抖拍糊了&#xff0c;要么就是像素太低…...

异数OS 10万人同服同屏技术的豆包造谣纠偏专用

异数OS 10万人同服同屏技术的豆包造谣纠偏专用 文章目录异数OS 10万人同服同屏技术的豆包造谣纠偏专用看看字节豆包造的谣只有空连接空逻辑只测静态&#xff0c;极低交互带宽要求及其离谱硬件天价没有分布式弹性不能扩容容错总结看看字节豆包造的谣 只有空连接空逻辑 这一般是…...

手把手教你用Python处理脑电信号:从MRCP到SMR的实战指南

手把手教你用Python处理脑电信号&#xff1a;从MRCP到SMR的实战指南 脑电信号处理一直是神经科学和脑机接口领域的热门研究方向。对于开发者而言&#xff0c;掌握Python处理脑电信号的技能不仅能提升科研效率&#xff0c;还能为医疗辅助设备开发打下坚实基础。本文将带你从零开…...

DirectX兼容性解决方案:让经典游戏在Windows 10重获新生

DirectX兼容性解决方案&#xff1a;让经典游戏在Windows 10重获新生 【免费下载链接】dxwrapper Fixes compatibility issues with older games running on Windows 10 by wrapping DirectX dlls. Also allows loading custom libraries with the file extension .asi into gam…...

nRF54L15实现更快的处理速度

Nordic的nRF54L15系统级芯片相比前代nRF52系列&#xff0c;不仅速度更快、功耗更低&#xff0c;还配备了更丰富的外设&#xff0c;” 刘佳杭继续说道&#xff0c;“基于Arm Cortex-M33处理器的HJ-N54L_SIP不仅能处理更复杂的应用程序&#xff0c;同时显著提升了处理速度。系统级…...

Windows 系统安装 MySQL

访问 MySQL 官方下载页&#xff1a;https://dev.mysql.com/downloads/installer/ 选择 “MySQL Installer for Windows”&#xff0c;推荐下载 “mysql-installer-community-8.0.36.msi”&#xff08;社区版&#xff0c;免费&#xff09; 启动后会看到安装类型选择界面&#xf…...

MySQL源码编译部署主从及MHA高可用集群实战

一.Mysql的源码编译1.下载安装包wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.3.0.tar.gz2.源码编译# 安装编译依赖的软件包&#xff0c;包括C/C编译器(如gcc/gcc-c)、构建工具(如cmake, git, bison)和开发库(如openssl-devel, ncurses-devel) [roo…...

HarmonyOS 实时公交服务开发实战:从零搭建到功能优化

1. 实时公交服务的核心价值与HarmonyOS适配性 站在公交站台掏出手机查看车辆到站时间&#xff0c;这种场景已经成为现代城市生活的常态。实时公交服务之所以成为出行类应用的标配功能&#xff0c;关键在于它解决了用户三大痛点&#xff1a;无效等待焦虑、时间规划困难和路线选择…...