<Linux> 基础IO

文章目录

  • 基础IO
    • 文件描述符
    • 重定向
      • 重定向本质
      • 重定向系统调用

基础IO

文件描述符

系统底层提供打开文件(open),读(read),写(write),关闭文件(close)的系统调用,如果想详细了解可以复制以下命令仔细阅读使用方法,这里不做赘述。

打开文件

man 2 open

man 2 read

man 2 write

关闭文件

man close

文件描述符fd,是file descriptor的简写,数据类型是int

这里我们新建4个文件

在这里插入图片描述

然后打开这4个文件,用4个文件描述符去接收返回值

代码如下

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{int fd1 = open("test1.txt", O_RDONLY);int fd2 = open("test2.txt", O_RDONLY);int fd3 = open("test3.txt", O_RDONLY);int fd4 = open("test4.txt", O_RDONLY);if (-1 == fd1){perror("open file:");_exit(1);}if (-1 == fd2){perror("open file:");_exit(1);}if (-1 == fd3){perror("open file:");_exit(1);}if (-1 == fd4){perror("open file:");_exit(1);}printf("%d\n", fd1);printf("%d\n", fd2);printf("%d\n", fd3);printf("%d\n", fd4);return 0;
}

运行结果如下:

在这里插入图片描述

看起来是按顺序递增,这是什么意思?难道跟数组下标有关?

open打开文件失败会返回-1,成功则会返回一个非负整数,可是这里为什么是从3开始递增?0,1,2呢?

0,1,2是预留给标准输入,标准输出,标准错误的,在进程创建时就已经被操作系统打开。

在进程打开文件时,进程内部会有一个数组指针,指向该进程的文件指针数组,而默认打开的标准输入,标准输出,标准错误就是该数组的0,1,2下标,在我们新打开文件时,这时就会从头开始扫描该数组,找到第一个为空的,存放内存中该文件地址,文件描述符就是该数组下标。

文件描述符本质:数组下标

原理图如下

在这里插入图片描述

重定向

重定向将输入或输出从标准位置改变到其他位置。

输出重定向

在这里插入图片描述

将原本输出到显示器改为输出到文件,打印文件内容即可查看信息

输入重定向

在这里插入图片描述

将原本从键盘读取输入改为从文件中读取输入,这就是输入重定向

重定向本质

输入重定向本质,将标准输入改为别的文件,就可以从该文件中读取输入,而不是从键盘读取输入。
输出重定向本质,将标准输出改为别的文件,就可以输出到该文件,而不是输出到显示器。

输入重定向验证

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{close(0);int fd = open("input.txt", O_RDONLY);if (-1 == fd){perror("open file:");_exit(1);}char buffer[64];memset(buffer, '\0', sizeof buffer);read(0, buffer, sizeof buffer);write(1, buffer, strlen(buffer));close(fd);return 0;
}

因为标准输入认准的就是0号下标,所以我们就让input.txt文件描述符成为0,原本从键盘读取输入变为从input.txt中读取数据,这就是输入重定向本质。

结果如下

在这里插入图片描述

输出重定向验证

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{close(1);int fd = open("output.txt", O_WRONLY | O_APPEND);if (-1 == fd){perror("open file:");_exit(1);}char buffer[64];fgets(buffer, sizeof buffer, stdin);write(1, buffer, strlen(buffer));close(fd);return 0;
}

运行起来之后,命令行会等待输入,我们输入字符串后,结果并没有显示在显示器上,打印output.txt文件后可以看到输入的字符串。

在这里插入图片描述

重定向系统调用

上面的代码只是为了验证重定向底层原理,如果想让实现重定向可以使用系统调用,可以查看下使用手册

man dup

这里使用dup2

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>int main() {// 打开文件 "output.txt" 并获取文件描述符int file_fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);if (file_fd < 0) {perror("open");return 1;}// 使用 dup2 将标准输出 (file descriptor 1) 重定向到文件描述符 file_fdif (dup2(file_fd, STDOUT_FILENO) < 0) {perror("dup2");close(file_fd);return 1;}printf("hello linux\n");close(file_fd);return 0;
}

原本打印到标准输出的内容就会被重定向到显示器

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

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

相关文章

C++程序编译 错误提示和评测状态

编译常见错误提示 1.[Error] expected ; before cout。在cout前面&#xff0c;缺少一个分号。 2.[Error] arr was not declared in this scope。未定义变量名arr。 3.[Error] ld returned 1 exit status。重复运行错误(上一个运行的程序&#xff0c;输入窗口没有关掉)。 或者…

如何解决windows自动更新,释放C盘更新内存

第一步&#xff1a;首先关闭windows自动更新组件 没有更新windows需求&#xff0c;为了防止windows自动更新&#xff0c;挤占C盘空间&#xff0c;所以我们要采取停止Windows Update服务。按下WinR打开运行对话框&#xff0c;输入services.msc&#xff0c; 然后按Enter。在服务…

24上软考成绩预计6月底公布?附查分指南

最近&#xff0c;很多小伙伴都在问上半年成绩什么时候出来&#xff1f;每天学习群变成了祈祷群&#xff0c;都在祈祷45,45,45。按照上一次的成绩发布时间&#xff0c;从考试结束到成绩发布&#xff0c;间隔了32天。这次是不是会更快&#xff1f; 一般阅卷只要7-10天&#xff0c…

vb.net教程

下载地址&#xff1a;https://download.csdn.net/download/wgxds/89462547

内核模块的各种概念及示例

基本概念 (1)模块本身不被编译入内核映像&#xff0c;从而控制了内核镜像的大小。模块一旦insmod&#xff0c;它就和内核中的其他部分完全一样 (2)内核中已加载模块的信息也存在于/sys/module目录下&#xff1b;内核中将包含/sys/module/test_mod目录 (3)modprobe在加载某模…

系统架构设计师 - 数据库系统(1)

数据库系统 数据库系统数据库模式 ★分布式数据库 ★★★数据库设计阶段 ★★ER模型 ★关系模型 ★ ★结构约束条件完整性约束 关系代数 ★ ★ ★ ★概述自然连接 大家好呀&#xff01;我是小笙&#xff0c;本章我主要分享系统架构设计师 - 数据库系统(1)知识&#xff0c;希望内…

2024-06-20力扣每日一题

链接&#xff1a; 2748. 美丽下标对的数目 **废话&#xff1a;**彩笔做题家回归&#xff0c;要开始找工作噜 题意 在数组里&#xff0c;按i<j规则取两个数字nums[i]和nums[j]&#xff0c;只要nums[i]的第一位数字和nums[j]的最后一位数字互质&#xff0c;则结果加一 解…

RX8025/INS5T8025实时时钟-国产兼容RS4TC8025

该模块是一个符合I2C总线接口的实时时钟&#xff0c;包括一个32.768 kHz的DTCXO。 除了提供日历&#xff08;年、月、日、日、时、分、秒&#xff09;功能和时钟计数器功能外&#xff0c;该模块还提供了大量其他功能&#xff0c;包括报警功能、唤醒定时器功能、时间更新中断功能…

访问控制列表(Access Control Lists,ACL)与哈希查找的爱恨情怨

访问控制列表&#xff08;Access Control Lists&#xff0c;ACL&#xff09;与哈希查找 什么是访问控制列表ACL&#xff1f;直接说ACL是干啥的ACL概念为什么需要ACLACL类型ACL匹配机制使用例子 哈希查找什么是哈希查找&#xff1f;哈希查找的基本原理哈希查找的步骤 哈希查找在…

H3C防火墙抓包(命令行)

命令行 请按照如下步骤收集下设备的debug信息 1&#xff09; 创建一个空ACL 3XXX&#xff0c;写上两条明细rule&#xff0c;分别对应来回流量的源目地址 [FW]acl advanced 3XXX [FW-acl-ipv4-adv-3XXX]rule permit ip source x.x.x.x 0 destination y.y.y.y 0 [FW-acl…

js如何实现开屏弹窗

开屏弹窗是什么&#xff0c;其实就是第一次登录后进入页面给你的一种公告提示&#xff0c;此后再回到当前这个页面时弹窗是不会再出现的。也就是说这个弹窗只会出现一次。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>…

【绝对有用】C++ vector const函数和右值移动

std::vector 是 C 标准库中的动态数组&#xff0c;提供了许多方便的函数来操作数组。以下是 std::vector 的常用函数及其使用方法&#xff1a; 构造函数 vector()&#xff1a;默认构造函数&#xff0c;创建一个空的 vector。vector(size_t n)&#xff1a;创建一个包含 n 个默…

索引和深分页优化案例

一、初始状态没加索引 总数据100w左右 浅分页 查询10条需要1.5s左右 select * from timer_task where app hzhXtimer order by run_timer limit 0,10深分页查询10条需要1.7s左右 select * from timer_task where app hzhXtimer order by run_timer limit 100000,10看执…

视频采集概念

视频采集通常指的是将视频信号从视频源&#xff08;如摄像头、视频播放器等&#xff09;捕获并转换为数字格式&#xff0c;以便于计算机处理和存储。 步骤&#xff1a; 视频信号捕获&#xff1a;通过摄像头、网络摄像头、视频采集卡等设备将视频信号捕获。 信号转换&#xff…

【diffusers极速入门(三)】生成的图像尺寸与 UNet 和 VAE 之间的关系

先上结论&#xff0c;一句话总结即&#xff1a; SD 图片的输入\输出尺寸&#xff08;高或宽&#xff09; Unet 输入\输出的样本尺寸&#xff08;高或宽&#xff09; x VAE 的缩放尺寸 在使用生成模型时&#xff0c;特别是图像生成任务中&#xff0c;理解 UNet 和 VAE&#xf…

【CPP】选择排序:冒泡排序、快速排序

目录 1.冒泡排序简介代码分析 2.快速排序2.1霍尔版本简介代码分析 2.2挖坑版本2.3前后指针版本2.4非递归的快排思路代码 什么是交换排序&#xff1f; 基本思想&#xff1a;所谓 交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0…

[BUUCTF从零单排] Web方向 01.Web入门篇之粗心的小李解题思路

这是作者新开的一个专栏《BUUCTF从零单排》&#xff0c;旨在从零学习CTF知识&#xff0c;方便更多初学者了解各种类型的安全题目&#xff0c;后续分享一定程度会对不同类型的题目进行总结&#xff0c;并结合CTF书籍和真实案例实践&#xff0c;希望对您有所帮助。当然&#xff0…

对比分析:GBDT、XGBoost、CatBoost和LightGBM

对比分析&#xff1a;GBDT、XGBoost、CatBoost和LightGBM 梯度提升决策树&#xff08;GBDT&#xff09;是当前机器学习中常用的集成学习方法之一&#xff0c;它通过集成多个弱学习器&#xff08;通常是决策树&#xff09;来构建强学习器。GBDT在分类和回归任务中表现优异&…

微软Azure AI更新视频翻译和语音翻译 API 功能!企业适用TTS文本转语音

很高兴与大家分享 Azure AI 语音翻译产品套件的两个重大更新&#xff01; 分别是视频翻译和增强的实时语音翻译 API。 视频翻译&#xff08;批量&#xff09; 微软宣布推出视频翻译预览版&#xff0c;这是一项突破性的服务&#xff0c;旨在改变企业本地化视频内容的方式。 随着…

微博舆情分析系统可以继续完善的基于python 前端vue

微博舆情分析系统可以继续完善的&#xff0c;前后端分离&#xff0c;前端基于vue 后端基于python的flask可以说是非常的简洁&#xff0c;支持实时更新数据。界面如图 主要工作点体现在后端实时更新数据跟数据的处理方面上&#xff0c;后续有空会用hadoop来处理海量数据真…