[Linux]基础IO(中)---理解重定向与系统调用dup2的使用、缓冲区的意义

news2024/10/6 16:29:16

重定向理解

        在Linux下,当打开一个文件时,进程会遍历文件描述符表,找到当前没有被使用的 最小的一个下标,作为新的文件描述符。

代码验证:

①:先关闭下标为0的文件,在打开一个文件,此时该文件的fd为0

  #include<stdio.h>
  #include<sys/types.h>
  #include<fcntl.h>
  #include<string.h>
  #include<unistd.h>

  int main()
  {
    //提前关闭下标为0的文件
    close(0);
    int fd=open("log.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);
    if(fd<0)
    {
      perror("open");
      return 1;
    }
    printf("log.txt打开成功:fd:%d\n",fd);                                                                                                                                                       
    close(fd);
    return 0;
  }

②:关闭下标为1的文件,在打开一个新的文件,再用 printf 打印一段信息

  #include<stdio.h>
  #include<sys/types.h>
  #include<fcntl.h>
  #include<string.h>
  #include<unistd.h>

  int main()
  {
    //提前关闭下标为1的文件
    close(1);
    int fd=open("log.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);
    if(fd<0)
    {
      perror("open");
      return 1;
    }
    printf("log.txt打开成功:fd:%d\n",fd);
    fflush(stdout);                                                                                                                                                       
    close(fd);
    return 0;
  }

出现的问题:

1.printf输出的内容没有出现在显示器上

2.应该在显示器上出现的信息却被加载到了文件中

【解释】:

在上述代码中,我们先关闭了下标为1的文件,在操作系统中该文件对应的是标准输出(显示器),而我们打开文件后,会将下标1作为该文件的描述符,printf函数的作用就是向下标为1的文件中写入信息,但是此时下标1对应的不在是标准输出了,对应的是我们打开的文件,但是上层仍认为1号下标对应的就是显示器,所以向1号下标文件写入就相当于向文件写入,而这个现象就称之为重定向,其本质是在内核中改变文件描述符表特定下标的内容,与上层无关

系统调用函数 dup2

该函数的功能是将文件描述符oldfd所对应文件内容拷贝给newfd对应文件

#include <unistd.h>
int dup2(int oldfd, int newfd);

举例:

  #include<stdio.h>
  #include<sys/types.h>
  #include<fcntl.h>
  #include<string.h>
  #include<unistd.h>
  int main()
  {
    int fd=open("log.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);
    if(fd<0)
    {
      perror("open");
      return 1;
    }
    dup2(fd,1);
    printf("hello Linux\n");
    printf("hello Linux\n");
    printf("hello Linux\n");                                                                                                                                                                   
    fflush(stdout);
    close(fd);
    return 0;
  }

缓冲区理解

如果将上述代码中的 fflush(stdout) 删除的话,应该向文件写入的信息又写不进去了,这又是为什么呢?程序结束不是会自动刷新缓冲区吗?信息去哪里了?

【解释】:

在c语言中,为了用户使用方便,封装了三个结构体,stdout、stdin、stderr,这三个结构体中除了封装了文件描述符外,还存在着语言级别的文件缓冲区

在[Linux]基础IO(上)--理解文件系统调用、文件描述符、万物皆文件一文中我们谈到,每一个文件的struct file都存在一个内核级的文件缓冲区,printf输出的内容会先保存在语言级别的那个缓冲区中,C语言在通过文件描述符将该缓冲区的内容加载到内核级别的文件缓冲区中,操作系统在刷新到外设

此时,程序中printf输出的内容就保存在语言级别的文件缓冲区中,虽然程序结束时会自动刷新缓冲区,但是在程序结束前,我们就已经将文件关闭了,就无法向文件中写入信息了,当程序结束时,这部分数据就丢失了

缓冲区刷新策略

1.立即刷新:fflush(stdout)  int fsync(int fd) 

2.行刷新:写满一行就刷新(显示屏)

3.全刷新:当缓冲区写满才刷新

4.特殊情况:程序结束强制刷新

缓冲区的意义:
  •  解耦:对于语言级别的文件缓冲区,只需要想怎样将数据导入缓冲中,不需要管语言怎么再将数据导入内核级文件缓冲区,对于内核级文件缓冲区,将数据导入进来后,就不需要管操作系统怎样将数据刷新到外设中了
  • 提高效率:系统调用是有一定的成本的,当缓冲区写满或者写完一行时,再调用系统接口,一次或多次的将内容进行处理,这样可以极大减少系统调用的次数,不仅可以提高IO速率,也可以提高用户的使用效率

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

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

相关文章

基于 NGINX 的 ngx_http_geoip2 模块 来禁止国外 IP 访问网站

基于 NGINX 的 ngx_http_geoip2 模块 来禁止国外 IP 访问网站 一、安装 geoip2 扩展依赖 [rootfxkj ~]# yum install libmaxminddb-devel -y二、下载 ngx_http_geoip2_module 模块 [rootfxkj tmp]# git clone https://github.com/leev/ngx_http_geoip2_module.git三、解压模…

android 使用ollvm混淆so

使用到的工具 ndk 21.4.7075529&#xff08;android studio上下载的&#xff09;cmake 3.10.2.4988404&#xff08;android studio上下载的&#xff09;llvm-9.0.1llvm-mingw-20230130-msvcrt-x86_64.zipPython 3.11.5 环境配置 添加cmake mingw环境变量如下图: 编译 下载…

代码随想录算法训练营第四十一天|343. 整数拆分,96. 不同的二叉搜索树

343. 整数拆分 题目 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 输入: n 10 输出: 36 解释: 10 3 3 4, 3 3 4 36。 解题思路 dp[i] …

Python读取Excel根据每行信息生成一个PDF——并自定义添加文本,可用于制作准考证

文章目录 有点小bug的:最终代码(无换行):有换行最终代码无bug根据Excel自动生成PDF,目录结构如上 有点小bug的: # coding=utf-8 import pandas as pd from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import letter from reportlab.pdfbase import pdf…

每日五道java面试题之消息中间件MQ篇(三)

目录&#xff1a; 第一题. 如何确保消息正确地发送至 RabbitMQ&#xff1f; 如何确保消息接收方消费了消息&#xff1f;第二题. 如何保证RabbitMQ消息的可靠传输&#xff1f;第三题. 为什么不应该对所有的 message 都使用持久化机制&#xff1f;第四题. 如何保证高可用的&#…

腾讯云2024年4月优惠券及最新活动入口

腾讯云是腾讯集团倾力打造的云计算品牌&#xff0c;提供全球领先的云计算、大数据、人工智能等技术产品与服务。为了吸引用户上云&#xff0c;腾讯云经常推出各种优惠活动。本文将为大家分享腾讯云优惠券及最新活动入口&#xff0c;助力大家轻松上云&#xff01; 一、优惠券领取…

IO-DAY4

使用文件IO 实现父进程向子进程发送信息&#xff0c;并总结中间可能出现的各种问题 #include<myhead.h> char* my_write(char *buf) {int wfdopen("./write.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);write(wfd,buf,sizeof(buf));close(wfd);return buf; } char* …

一.基本指令(1.1)

一、操作系统&#xff1a; 1.1本质&#xff1a; 操作系统是一款进行软硬件资源管理的软件。 1.2操作系统如何管理硬件&#xff1a; 硬件接入电脑&#xff0c;操作系统装载硬件的驱动之后&#xff0c;硬件就会被纳入操作系统的管理体系。因此&#xff0c;有时一些硬件初次接入电…

HTTPS跟HTTP有区别吗?

HTTPS和HTTP的区别&#xff0c;白话一点说就是&#xff1a; 1. 安全程度&#xff1a; - HTTP&#xff1a;就像是你和朋友面对面聊天&#xff0c;说的话大家都能听见&#xff08;信息明文传输&#xff0c;容易被偷听&#xff09;。 - HTTPS&#xff1a;就像是你们俩戴着加密耳机…

【js刷题:数据结构数组篇之有序数组的平方】

有序数组的平方 一、题目二、解题方法1、暴力解法2、双指针思路代码 三、力扣刷题合并两个有序数组 一、题目 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 二、解题方法 1、暴力解法 c…

RESTful规范总结

概念&#xff1a;RESTful&#xff08;Representational State Transfer 的缩写&#xff09;是一种广泛使用的API架构风格。 1.资源&#xff1a;在REST API的设计中&#xff0c;首先需要面向资源建模&#xff0c;其中每个节点是是一个简单资源或集合资源。 1.1一个集合包含相同…

Win10本地搭建HTTP服务器和FTP服务器

一、开启windows功能 1.进入电脑控制面板-程序-启用或关闭windows功能 2.勾选这3个功能以及展开的全部勾选 二、搭建http服务器 1.打开Internet Information Server&#xff08;IIS&#xff09;管理器 在开始菜单里面找到IIS管理器管理控制台或者搜索IIS打开 2.添加网站 进…

【原创】基于springboot+vue学生信息管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

<网络> 网络Socket 编程基于UDP协议模拟简易网络通信

目录 前言&#xff1a; 一、预备知识 &#xff08;一&#xff09;IP地址 &#xff08;二&#xff09;端口号 &#xff08;三&#xff09;端口号与进程PID &#xff08;四&#xff09;传输层协议 &#xff08;五&#xff09;网络字节序 二、socket 套接字 &#xff08;…

图的应用试题

01&#xff0e;任何一个无向连通图的最小生成树( )。 A.有一棵或多棵 B.只有一棵 C.一定有多棵 D.可能不存在 02.用Prim算法和Kruskal算法构造图的最小生成树&#xff0c;…

Kitex 提供的服务注册与发现 etcd 拓展

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列、spring教程等&#xff0c;大家有兴趣的可以看一看 &#x1f4d9;Jav…

Navicat for MySQL 15免费注册方法

一、效果图如下&#xff1a; 注&#xff1a;此方法仅用于非商业用途&#xff0c;请勿传播&#xff0c;否则后果自负。 二、下载安装 下载安装包&#xff0c;分为32位和6位&#xff0c;下载文件名&#xff1a;Navicat for MySQL 15.zip&#xff08;https://download.csdn.net/…

阿赵UE学习笔记——23、动画蒙太奇

阿赵UE学习笔记目录   大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用方法。上一篇介绍了动画合成功能&#xff0c;这次介绍的动画蒙太奇&#xff0c;和动画合成有很多类似的东西&#xff0c;但本质上却又不同。   蒙太奇是法语“剪接”的意思。所以动画蒙太奇&…

2024年03月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析

本文收录于专栏《Scratch等级认证CCF-GESP真题解析》,专栏总目录・点这里. 一、单选题(共 10 题,每题 3 分,共 30 分) 第1题 小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?( )。 A、小程序 B、计时器 C、操作系统 D、神话人物 答案:…

XAMPP本地开发环境软件的最佳替代品

在开发新网站或应用时&#xff0c;选择合适的本地开发环境是至关重要的。本地开发环境让您可以在自己的电脑上搭建和测试网站或应用&#xff0c;直到它们准备好被迁移到线上服务器。一些工具甚至提供了推送到生产环境的功能&#xff0c;以及设置多个本地站点的能力。 XAMPP是一…