[Linux]重定向

news2024/12/23 13:39:57

一、struct file内核对象

struct file是在内核中创建,专门用来管理被打开文件的结构体。struct file中包含了打开文件的所有属性,文件的操作方法集以及文件缓冲区(无论读写,我们都需要先将数据加载到文件缓冲区中。等等。

我们在应用层进行数据的读写,本质是将内核缓冲区中的数据,进行来回拷贝。

二、文件描述符fd分配规则

1、进程默认打开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()
{
  char buf[1024];
  ssize_t s = read(0, buf, 1024);
  if(s > 0)
  {
    buf[s-1] = 0;//这样我们最后输入的那个回车(换行)就不会被打印

    write(1,buf,strlen(buf));
   // printf("%s\n",buf);
  }



  return 0;
}

运行程序后,程序等待我们输入:

 

随意输入字符:

 

按下回车:

 

程序执行完毕。

 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("test.txt",O_WRONLY | O_CREAT | O_TRUNC, 0666);
  printf("fd:%d\n",fd);
  close(fd);

  return 0;
}

此时我们打开的这个test.txt文件,其fd就成了0:

  

三、重定向

1、输出重定向:

那么,如果我们close(1)呢?

(1)close(1)

#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("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
  if(fd < 0)
  {
    perror("open");
    return 1;
  }

  printf("fd:%d\n",fd);

  close(fd);

  return 0;
}

可以看到,屏幕未输出任何东西,log.txt文件中也没有内容:

(2)fflush(stdout)

当我们刷新fflush(stdout)时:

#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("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
  if(fd < 0)
  {
    perror("open");
    return 1;
  }

  printf("fd:%d\n",fd);
  printf("stdout->%d\n",stdout->_fileno);
  fflush(stdout);
  close(fd);

  return 0;
}

运行程序:

我们将其称为:输出重定向。 

(3)总结:

上层并不知道我们将1号文件描述符的指向改变了,printf()打印的本质是向1号文件描述符里面打印,具体1号文件描述符指向的是显示器,就向显示器打印,指向的是文件,就向文件里打印。所以这里,printf()就向log.txt里面打印了。

重定向的 本质就是修改 文件描述符表 特定数组下标 里面的内容。

2、输入重定向:

我们首先向log.txt文件中写入数据:

 我们首先close(0),然后再打开log.txt,这样log.txt的文件描述符fd就是0。

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


int main()
{
  close(0);

  char buf[1024];
  int fd = open("log.txt",O_RDONLY);
  if(fd < 0)
  {
    perror("open");
    return 1;
  }

  fread(buf,1,sizeof buf,stdin);
  buf[strlen(buf)-1] = 0;//将"\n"符号改为0
  printf("%s\n",buf);

  return 0;
}

 运行程序,我们可以看到,log.txt文件中的内容被打印出来了:

3、原理:

上层的fd不变,底层fd指向的内容在改变。 

4、使用

 我们这里使用dup2:

将oldfd的数组内容拷贝到newfd的数组内容中。

需要注意的是,这样就会导致有多个fd指向一个打开的文件,为了避免一个fd把文件关闭的时候,影响到其余的fd,在struct file中,存在一个f_count用来计数,有几个指针指向该文件,f_count就为几。

我们首先查看log.txt中的内容:

 

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


int main()
{
  int fd = open("log.txt",O_APPEND | O_WRONLY);
  if(fd < 0)
  {
    perror("open");
    return 1;
  }

  dup2(fd,1);
  printf("haha\n");
  fprintf(stdout,"yeye\n");

  close(fd);
  
  return 0;
}

然后执行程序:

可以看出文件内新增了内容。

 

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

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

相关文章

#centos7搭建php8+nginx环境#

场景:为了实现上传的pdf文件转成png图片,需要搭建一个php8nginx的运行环境&#xff0c;最后安装imagic扩展 安装顺序 php-> linux-> imagemagick -> ghostscript -> imagick 一&#xff1a;安装phpnginx环境 1、安装remi扩展源 remi源是Remi repository是包含最新…

消安一体化解决方案

前言 随着信息技术的飞速发展&#xff0c;物联网技术正以前所未有的速度渗透至生活的各个角落&#xff0c;其中智能家居作为物联网技术应用的重要场景之一&#xff0c;不仅提升了居住的便捷性&#xff0c;更是对家庭安全提出了新的挑战和要求。在这样的背景下&#xff0c;将消防…

161.二叉树:在每个树中找最大值(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

易联众智能自动办理平台,AI赋能让数字政务服务“触手可及”

“城乡居民参保怎么办”“要去XX省工作了,帮我办理异地就医备案”……通过口语化的文字、语音提问,易联众智能自动办理平台的AI助理都可以准确理解对话,并依据政策文件给出详细回答,人机对话像聊天一样轻松。 近日,宁德市民王先生高兴地说:“过去办理医保业务不懂流程,容易走弯…

第22讲:文件操作

文章目录 第22讲&#xff1a;文件操作1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 3. 二进制文件和文本文件&#xff1f;4. 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭 5. 文件的顺序读写5.1 顺序读写函数介…

文刻创作ai工具

文刻创作AI工具是一种利用人工智能技术来辅助创作文本的工具。 领取激活方式&#xff1a;https://qvfbz6lhqnd.feishu.cn/wiki/HsY4wmoffiNp4FkB2AbcpL4tn6d 它能够生成、修改、编辑和优化各种类型的文本内容&#xff0c;包括文章、故事、诗歌、广告文案等。 通过分析大量的文…

比较好的Python课程

最近在学习夜曲编程的Python进阶课程——办公效率化&#xff1b;夜曲编程之前有推出一款学习Python的入门课程&#xff0c;在手机端和电脑端都可以学习的&#xff0c;如果没有时间在手机端学习都很好的。每节课程学习下来&#xff0c;可以收集到Python入门的知识卡片&#xff0…

全志H616 通过Cedrus和v4l2_request API实现硬件编解码加速(香橙派zero2)

编译安装或加载cedrus驱动模块&#xff0c;加载v4l2-mem2mem Sunxi-Cedrus 致力于为全志 SoC 提供硬件加速的视频解码和编码支持&#xff0c;并将其引入主线 Linux 内核。此外&#xff0c;还为典型的基于 GNU/Linux 的系统提供了与内核驱动程序接口的其他用户空间组件。 Sunx…

Java使用Hutool工具类轻松生成验证码

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 目录 一、效果展示1.1 扭曲干扰的验证码1.…

C++学习第十一天——vector的模拟实现

✨ 生于火焰&#xff0c;落俗不可避免&#xff0c;但浪漫至死不渝 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &…

白玉兰之争王一博vs王阳谁将摘得男主荣耀

白玉兰之争&#xff1a;王一博VS王阳&#xff0c;谁将摘得男主荣耀&#xff1f;在这个星光璀璨的夜晚&#xff0c;白玉兰奖的提名名单犹如一道耀眼的闪电&#xff0c;点燃了娱乐圈的硝烟。其中&#xff0c;王一博与王阳入围白玉兰男主角的消息更是引发了热议狂潮。两位实力派演…

使用pytorch构建ResNet50模型训练猫狗数据集

数据集 1.导包 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms, models import numpy as np import matplotlib.pyplot as plt import os from tqdm.auto import t…

iOS ------ 多线程 GCD

一&#xff0c;GCD简介 GCD是Apple开发的一个多线程的较新的解决方案。它主要用于优化应用程序以支持多核处理器以及其他对称处理系统。它是一个在线程池模式的基础上执行的并发任务。 为什么要使用GCD&#xff1f; GCD&#xff01;可用于多核的并行运算GCD会自动利用更多的…

dockers安装mysql

1.dockerhub上搜索自己需要安装得镜像版本 dockerhub网址&#xff1a;https://hub-stage.docker.com docker pull mysql:5.7 #下载自己需要得版本2.启动容器实例&#xff0c;并且挂载容器数据卷 docker run -d -p 3306:3306 --privilegedtrue \ -v /home/mysql/log:/var/log/…

模拟 CMOS 逆变器的开关功耗

我们不会进一步讨论静态功耗。相反&#xff0c;本文和下一篇文章将介绍 SPICE 仿真&#xff0c;以帮助您更全面地了解逆变器的不同类型的动态功耗。本文重点讨论开关功率——输出电压变化时电容充电和放电所消耗的功率。 LTspice 逆变器实施 图 1 显示了我们将使用的基本 LTsp…

小白跟做江科大32单片机之OLED驱动

原理部分 代码测试 1.江科大老师提供的以下代码文件放入工程中&#xff0c;进行测试 2.正常显示即可

一点连接千家银行,YonSuite让“企业资金”实时在线

用友YonSuite作为全场景SaaS应用服务&#xff0c;是成长型企业实现数智转型的不二选择。多年来&#xff0c;凭借不断的技术革新&#xff0c;通过与千家银行的一站式连接&#xff0c;实现了企业资金的实时在线管理&#xff0c;为成长型企业带来了极大的便利和效益。这一举措不仅…

618适合入手哪些数码好物?实用数码好物清单分享,错过拍烂大腿!

在一年一度的618购物狂欢节里&#xff0c;许多数码爱好者们都在这次盛大的购物盛宴中觅得心仪的数码好物&#xff0c;数码产品不仅改变了我们的生活方式&#xff0c;更让我们享受到了前所未有的便捷和乐趣&#xff0c;那么在这个618&#xff0c;哪些数码好物值得我们入手呢&…

在线IP检测如何做?代理IP需要检查什么?

当我们的数字足迹无处不在&#xff0c;隐私保护显得愈发重要。而代理IP就像是我们的隐身斗篷&#xff0c;让我们在各项网络业务中更加顺畅。 我们常常看到别人购买了代理IP服务后&#xff0c;通在线检测网站检查IP&#xff0c;相当于一个”售前检验““售后质检”的作用。但是…

Golang:使用Base64Captcha生成数字字母验证码实现安全校验

Base64Captcha可以在服务端生成验证码&#xff0c;以base64的格式返回 为了能看到生成的base64验证码图片&#xff0c;我们借助gin go get -u github.com/mojocn/base64Captcha go get -u github.com/gin-gonic/gin文档的示例看起来很复杂&#xff0c;下面&#xff0c;通过简…