【Linux基础IO】重定向以及原理分析

我们先来看下面一个情况:

cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define filename "text.txt"
  int main()
  {
    close(1);//关闭了Liunx操作系统为我们默认打开的fd = 1的文件流stdout
    int fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0666);
    if(fd < 0)
    {
      perror("open");
      return 1;
    }
    const char* arr = "hello fileoperation\n";
    int cnt = 3;
    while(cnt)
    {
      write(1, arr, strlen(arr));
      --cnt;
    }
    close(fd);
  
    return 0;
  }                       

为什么我们把fd=1的显示器文件流stdin关闭了,向fd=1的显示器文件中写入文件就会写入到text.txt里呢?这就发生了重定向,常见的重定向有:>, >>, < 。 首先得弄清楚操作系统对于文件描述符的分配规则:在task_struct里存储的指针指向的files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。

dup2函数

利用dup2函数进行重定向:

cpp 复制代码
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #define filename "text.txt"
   int main()
   {
    //close(1);//关闭了Liunx操作系统为我们默认打开的fd = 1的文件流stdout                                                                              
    int fd = open(filename, O_RDONLY);
    if(fd < 0)
    {
      perror("open");
      return 1;
    }
    dup2(fd, 0);
    close(fd);//关掉与不关掉都可以,因为fd已经有了一份拷贝
    char buffer[100];
    ssize_t a = read(0, buffer, sizeof(buffer)-1);
    if(a > 0)
    {
      buffer[a] = '\0';
      printf("buffer:%s\n", buffer);
    }
  
    return 0;
  }

可以看到发生了重定向。

命令行中实现重定向:

stdout与stderr

cpp 复制代码
#include <stdio.h>
   int main()
   {
     fprintf(stdout, "hello normal message\n");
     fprintf(stdout, "hello normal message\n");
     fprintf(stderr, "hello error message\n");
     fprintf(stderr, "hello error message\n");                                                                                                         
     return 0;
   }

重定向的原理分析

重定向的本质是对描述进程的task_struct里的成员指针指向的文件描述符表进行修改。

相关推荐
树℡独32 分钟前
ns-3仿真之应用层(五)
服务器·网络·tcp/ip·ns3
小小管写大大码1 小时前
如何让vscode变得更智能?vscode接入claude实现自动编程
运维·ide·vscode·自动化·编辑器·ai编程·腾讯云ai代码助手
嵩山小老虎1 小时前
Windows 10/11 安装 WSL2 并配置 VSCode 开发环境(C 语言 / Linux API 适用)
linux·windows·vscode
Fleshy数模2 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
zhang133830890752 小时前
CG-09H 超声波风速风向传感器 加热型 ABS材质 重量轻 没有机械部件
大数据·运维·网络·人工智能·自动化
a41324472 小时前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
Configure-Handler2 小时前
buildroot System configuration
java·服务器·数据库
津津有味道2 小时前
易语言TCP服务端接收刷卡数据并向客户端读卡器发送指令
服务器·网络协议·tcp·易语言
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.3 小时前
Keepalived VIP迁移邮件告警配置指南
运维·服务器·笔记
物联网软硬件开发-轨物科技3 小时前
【轨物洞见】告别“被动维修”!预测性运维如何重塑老旧电站的资产价值?
运维·人工智能