Linux系统中的重定向

news/2024/9/28 23:01:56 标签: linux

目录

一、回顾重定向命令

1.输出重定向 >

2.追加重定向 >>

3.输入重定向 <

二、重定向原理

三、dup2函数


一、回顾重定向命令

1.输出重定向 >

echo xxx > filename:将数据写入到文件中

文件不存在则创建文件再写入;文件存在则先清空再写入

2.追加重定向 >>

echo xxx >> filename:将数据写入到文件中

文件不存在则创建文件再写入;文件存在则在文件末尾追加写入数据

3.输入重定向 <

cat < filename:将文件中的数据读取到显示器中

二、重定向原理

Linux系统中被打开的文件都会有一个文件描述符,并且文件描述符的分配原则是:在文件描述符表files_struct的指针数组当中,找到当前没有被使用的 最小的一个下标,作为新的文件描述符。

进程会默认打开文件描述符分别为0、1、2的标准输入、标准输出和标准错误,所以如果我们关闭标准输出1,那么进程再打开另外一个文件,则该文件的文件描述符就为1。但是进程并不知道此时标准输出被关闭了,依然认为文件描述符为1的文件就是标准输出。根据这个原理,我们就可以实现输出重定向:将原本输出到显示器的数据,输出到文件中

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
const char* filename = "log.txt";
int main() {
    close(1); // 关闭标准输出
    int fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0666);
    if (fd == -1) {
        perror("open");
        return 1;
    }
    // 输出到文件描述符为1的文件中,即输出到log.txt文件中
    printf("111111111111\n");
    fprintf(stdout, "2222222222222222\n");
    fflush(stdout);//将数据刷新到语言级缓冲区
    close(fd);
    return 0;
}

同理,追加重定向就是在打开文件时O_TRUNC选项改为O_APPEND选项即可

输入重定向:关闭标准输入0

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
const char* filename="log.txt";
int main() {
    close(0); // 关闭标准输入
    int fd = open(filename, O_RDONLY);
    if(fd == -1) {
        perror("open");
        return 1;
    }
    // 此时,新打开的文件log.txt的文件描述符为0
    char buf[1024]; // 缓冲区
    fgets(buf, sizeof(buf), stdin); // stdin指向文件描述符为0的文件,即指向log.txt,所以是从文件log.txt中读取数据
    printf("%s\n", buf); // 输出数据
    close(fd);
    return 0;
}

三、dup2函数

dup2函数时C语言中的用于操作文件描述符的函数,它可以用来复制一个现有的文件描述符,使得新的文件描述符与现有的文件描述符共享相同的文件,使用该函数就可以重定向标准输入、标准输出和标准错误流。

int dup2(int oldfd, int newfd);

oldfd:现有的文件描述符

newfd:新的文件描述符

返回值:调用成功返回新的文件描述符,调用失败返回-1并设置全局变量 errno 以指示错误原因。

上述重定向原理中,利用文件描述符分配规则,将标准输出1关闭,新打开的文件其文件描述符就是1。而有了dup2函数后,直接将需要重定向的文件复制到标准输入/输出/错误中。

以输出重定向为例

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
    int fd = open("log.txt", O_CREAT | O_RDWR | O_TRUNC);
    if (fd == -1) {
        perror("open");
        return 1;
    }
    if (dup2(fd, 1) == -1) {
        perror("dup2");
        return 1;
    }
    printf("hello linux file!\n");
    fflush(stdout); // 确保将输出缓冲区的数据写入文件
    close(fd);
    return 0;
}

http://www.niftyadmin.cn/n/5682020.html

相关文章

Redis哈希类型详解:从基础命令到实际应用

引言 前边介绍了 Redis 中字符串类型&#xff0c;现在接上篇文章继续学习 Redis 哈希类型的命令和实际应用 哈希&#xff08;Hash&#xff09;类型是一种非常实用的数据结构&#xff0c;以字段-值对的形式存储多个键值对。这里将详细介绍 Redis 哈希类型的使用方法、内部编码…

【RocketMQ】RocketMQ快速入门

&#x1f3af; 导读&#xff1a;该文档介绍了Apache RocketMQ消息队列的基础应用&#xff0c;包括消息发送与接收的基本流程。首先通过创建生产者实例&#xff0c;并指定名称服务器地址&#xff0c;启动后即可发送消息至指定主题。然后创建消费者实例订阅相应主题&#xff0c;并…

MATLAB数据文件读写:2.矩阵数据读取

矩阵数据读取 写入文件–save函数 保存变量到文件中&#xff0c;用于以后使用。 save(fielname) 将当前工作区中所有变量保存到matlab格式的二进制文件filename中。: .mat save(filename, ‘var’,fmt) 将当前工作区中var指定的结构体数组的变量或字段保存到matlab格式的…

线上报名小程序怎么做

在这个数字化、智能化的时代&#xff0c;信息技术的发展正以前所未有的速度改变着我们的生活。无论是学习、工作还是娱乐&#xff0c;互联网都成为了我们不可或缺的一部分。而在线上报名这一领域&#xff0c;小程序的出现更是为广大用户带来了前所未有的便捷与高效。今天&#…

用大模型 vs 垂直大模型

人工智能&#xff08;AI&#xff09;大模型的发展已经进入了一个新的战场&#xff0c;主要分为通用大模型和垂直大模型两个方向。通用大模型因其广泛的应用场景和普适性备受关注&#xff0c;而垂直大模型则因其在特定领域内的高效性和专业性逐渐崭露头角。随着技术的不断演进&a…

基于Node.js+Express+MySQL+VUE实现的在线电影视频点播网站管理系统的设计与实现部署安装

目录 1. 引言 1.1开发背景 1.2开发意义 1.3国内外研究 2. 需求分析 3. 系统架构设计 4. 关键技术选型 5. 功能模块设计 5.1功能图 5.2界面介绍 6. 总结 1. 引言 随着互联网技术的快速发展和普及&#xff0c;人们获取信息的方式发生了巨大变化&#xff0c;其中在…

AI周报(9.22-9.28)

AI应用-Siipet宠物沟通师 Siipet是一款由SiiPet公司推出的创新宠物行为分析相机&#xff0c;旨在通过尖端技术加深宠物与主人之间的情感联系。这款相机利用先进的AI算法&#xff0c;能够自动识别和分析家中宠物的行为&#xff0c;并提供定制化的护理建议。 SiiPet相机的核心功…

iOS 小组件

基本知识 时间轴 小组件通过AppIntentTimelineProvider进行 UI 刷新 struct Provider: AppIntentTimelineProvider {func placeholder(in context: Context) -> SimpleEntry {// 添加占位的&#xff08;选择添加的时候使用&#xff09;// todo}func snapshot(for configu…