Linux 输出重定向 “>”、“>>”、“freopen”

news2024/9/20 1:08:37

有时候,我们编码时会使用printf或fprintf去打印输出调试信息或者报错信息,但正常这样去打印,只会显示在终端,如果终端关闭了,或者系统宕机了等,这些输出信息就没有了,为了将这些重要的信息保存下来,可以输出重定向到文件,将这些信息直接输出到文件中保存着。


Linux的本质就是一切皆文件,输入输出设备也是以文件形式存在和管理的。

任何一个程序在Linux中运行,Linux系统都会为其创建3个已经打开的stream,分别用来输入(0:stdin),输出(1:stdout),打印诊断和错误信息(2:stderr)。通常他们会被连接到用户终端。这3个句柄的类型为指向FILE的指针。可以被fprintf、fread等函数使用,他们在程序开始启动后,stdin, stdout, and stderr 的文件描述符是 0, 1和2,其它的文件描述符则排在其后。

注意:stderr是不缓存的,stdout则是有缓存。

意思是:有缓存功能的,直到遇到回车'\n'才会进行打印输出,否则一直留在缓冲区里;而没有缓存功能的没有任何限制,直接打印输出。例:

#include <unistd.h>
#include <stdio.h>


int main(int argc, char **argv) {
    
    for (int i = 0; i < 5; i++) {
        //fprintf(stdout, "This is stdout[%d]\n", i);
		fprintf(stdout, "This is stdout[%d]", i);
        sleep(1);
    }

    fprintf(stdout, "\n");

    for (int i = 0; i < 5; i++) {
        fprintf(stderr, "This is stderr[%d]", i);
        sleep(1);
    }

    fprintf(stderr, "\n");
    sleep(5);

    return 0;
}

 可以看出,第一个for循环中输出的语句是一起输出的,它是遇到fprintf(stdout, "\n");这行代码输出的回车后一起输出的。由此可以证明,stdout真的是带有缓存的,直到遇到回车后会输出。stderr却不受影响,正常输出。

 如果需要使stdout正常输出,则加上"\n"即可!如上面注释的代码!

思考:很多时候我们会用printf打印信息来调试程序,但是如果终端关掉了,那怎么显示printf的调试信息呢?


重定向

1. >

        运行程序时,加上 "> 文件名",即可将代码中标准输出(stdout)的字符串输出到指定文件中。值得注意的是,标准出错(stderr)无法使用此种方式输出到文件。例:

        

#include <unistd.h>
#include <stdio.h>


int main(int argc, char **argv) {
    
    printf("输出重定向:printf...\n");
    fprintf(stdout, "输出重定向:fprintf(stdout)...\n");
    fprintf(stderr, "输出重定向:fprintf(stderr)...\n");
    perror("输出重定向:perror...\n");

    return 0;
}

正常运行:   

(最后输出的“:Success”是perror输出的,因为errno全局变量没有存储报错标志,所以输出Success)

输出重定向到文件:

 可以看出,标准输出的已经输出到文件中了。

那么标准出错又该如何输出到文件呢?在运行尾部继续输入“2>&1”即可。

例如:./redirector > test.log 2>&1 

 全都输出到文件中了;但是,它是先输出标准出错,然后再输出标准输出,为什么呢?我觉得应该是缓存所导致的!

另外,使用“>”重定向到文件,会覆盖掉之前的信息,那么如何追加呢?

2. >>

        使用“>>”即可达到追加效果。     ./redirector >> test.log 2>&1   

3. freopen        

FILE *freopen(const char *path, const char *mode, FILE *stream);

path:文件名

mode

            mode                                        描述
                r读方式打开文件,该文件必须存在。
                r+读写方式打开文件,该文件必须存在。
                w写方式打开文件,文件不存在则创建,存在则覆盖。
                w+读写方式打开文件,文件不存在则创建,存在则覆盖。
                a追加方式打开文件,尾部追加,文件不存在则创建。
                a+追加方式打开文件,尾部追加,且可以读取。

stream:取值 stdout 或 stderr.

例:

#include <unistd.h>
#include <stdio.h>


int main(int argc, char **argv) {
    
    FILE *out = freopen("test1.log", "a", stdout);
    //FILE *out = freopen("test1.log", "a", stderr);
    
    printf("输出重定向:printf...\n");
    fprintf(stdout, "输出重定向:fprintf(stdout)...\n");
    fprintf(stderr, "输出重定向:fprintf(stderr)...\n");
    perror("输出重定向:perror...\n");

    fclose(stdout);
    //fclose(stderr);

    return 0;
}

 使用stdout打开的文件,就只会将标志输出写入文件;使用stderr就会将标志出错写入文件!

当然我们一定要明白,printf输出到文件,这会引起IO中断,因此执行printf比一般的指令的效率要低很多。


总结:

        平常时我们调试代码或一些小例子代码,可以使用重定向;但对于大型项目,推荐还是使用工程级的日志,例如log4或plog等。

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

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

相关文章

java诊断与调优常用命令jmap、jstack、jstat使用实战

java应用运行过程中难免会出现问题&#xff0c;特别是在生产环境&#xff0c;发生异常或宕机情况&#xff0c;需要诊断与分析&#xff0c;定位原因&#xff0c;进行优化&#xff0c;避免下次再次出现问题。 虽然现在有很多可视化工具&#xff0c;使用起来比命令行更方便&#x…

开学季好用电容笔有哪些?好用实惠的电容笔推荐

随着科学技术的快速发展&#xff0c;ipad的影响力越来越大&#xff0c;而且ipad的用户也越来越多&#xff0c;如果要提高ipad的功能&#xff0c;让ipad更加有趣&#xff0c;那么就需要一款非常适合自己&#xff0c;并且非常实用的电容笔。那么&#xff0c;究竟该选择哪个品牌的…

SpringBoot整合分布式锁redisson

1、导入maven坐标<!-- 用redisson作为所有分布式锁&#xff0c;分布式对象等功能框架--><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.5</version></dependency>2、red…

蓝牙 - BLE中的连接和扫描参数设定

连接参数 / Connection Parameters 连接参数由发起设备与连接请求一起发送&#xff0c;当连接建立后&#xff0c;任何一个设备都可以修改。这些参数如下&#xff1a; 连接间隔 / Connection Interval 在低功耗蓝牙连接中&#xff0c;使用了跳频方案。两台设备发送各自数据和接…

day48【代码随想录】动态规划之最长递增子序列、最长连续递增序列、最长重复子数组

文章目录前言一、最长递增子序列&#xff08;力扣300&#xff09;二、最长连续递增序列&#xff08;力扣674&#xff09;三、最长重复子数组&#xff08;力扣718&#xff09;前言 1、最长递增子序列 2、最长连续递增序列 3、最长重复子数组 一、最长递增子序列&#xff08;力扣…

rocketmq延时消息自定义配置;topic下tag使用

概述 使用的是开源版本的rocketmq4.9.4 rocketmq也是支持延时消息的。 rocketmq一般是4个部分&#xff1a; nameserver&#xff1a;保存路由信息broker&#xff1a;保存消息生产者&#xff1a;生产消息消费者&#xff1a;消费消息 延时消息的处理是在其中的broker中。 但是…

我为什么放弃WinUI3

基于WinUI3开发HiNote已经有一个多月的时间了&#xff0c;算是做出来一个简单能用的C端软件。 基于个人的经历&#xff0c;说说其中的开发体验。 UI设计语言 无论是否抄袭苹果&#xff0c;WinUI3给人的感觉都是眼前一亮的。简洁美观&#xff0c;现代化&#xff0c;毛玻璃的美…

rk3568网口CAN串口通信速率性能

通信接口性能参数外设接口性能参数测试结果为实验室实测值&#xff0c;可作为设计参考&#xff0c;但因测试环境和器件批次差异&#xff0c;可能会存在一定的误差&#xff0c;且测试结果依赖评估板性能&#xff0c;核心板搭配不同底板性能也可能存在差异&#xff0c;请结合实际…

Redis之分布式锁

随着业务发展的需要&#xff0c;原单体单机部署的系统被演化成分布式集群系统后&#xff0c;由于分布式系统多线程、多进程并且分布在不同机器上&#xff0c;这将使原单机部署情况下的并发控制锁策略失效&#xff0c;单纯的 Java API并不能提供分布式锁的能力。为了解决这个问题…

Java:顶级Java应用程序服务器 — Tomcat、Jetty、GlassFish、WildFly

如果你想编写Java web应用程序&#xff0c;首先需要做出一个艰难的决定&#xff1a;选择运行应用程序的Java应用程序服务器。什么是应用服务器?一般来说&#xff0c;应用程序服务器执行Java应用程序。在操作系统中启动它们&#xff0c;然后将应用程序部署到其中。将应用程序服…

盘点2023年大企业都在用的优秀项目管理软件

行内有句话&#xff1a;每个成功的项目背后肯定有一个成功的项目经理&#xff0c;而每个项目经理背后都少不了一些专业的项目管理工具。要在任何项目中取得成功&#xff0c;对项目进行全面的管理非常关键&#xff0c;包括项目的执行、计划、推进、监控、结果等&#xff0c;有了…

谈谈我对ai发展的看法

最近难得有时间&#xff0c;通过白话&#xff0c;聊聊我对AI的看法&#xff0c;仅代表个人观点首先表明我的观点&#xff1a;人类当前的人工智能成果&#xff0c;仍然停留在一知半解程度。技术的发展是需要长期的积累和进步&#xff0c;目前AI的发展仍处于入门阶段人类的发展必…

ar远程协助可视化云平台提高患者的医疗体验

“专家的指导意见很科学&#xff0c;患者恢复很快&#xff0c;情况稳定就可以转入普通病房了!这种云急救对基层医院来说太及时太必要了!大专家不用奔波&#xff0c;我们又提高了救治能力和效率!”这是来自某市基层主任的心里话。 传统远程协助的局限性 传统远程带来了便捷的线上…

【Java基础】输入与输出

输入与输出 输入 获取用键盘输入常用的两种方法 方法 1&#xff1a;通过 Scanner Scanner input new Scanner(System.in); String s input.nextLine(); input.close();方法 2&#xff1a;通过 BufferedReader BufferedReader input new BufferedReader(new InputStrea…

实验室设计|实验室设计要点SICOLAB

一、实验室设计规划要素1、实验室布局&#xff1a;实验室的布局要符合实验室工作流程&#xff0c;可以将实验室划分为干净区和污染区&#xff0c;以确保实验室的卫生和实验的准确性。2、设备选购&#xff1a;根据实验需要选择适当的设备&#xff0c;并确保设备的质量和性能符合…

LA@ML特征分解@奇异值分解@伪逆

文章目录特征分解几何示意图二次型和生成子空间奇异值分解理论数学风格的描述奇异值分解和特征分解的联系&#x1f60a;&#x1f388;机器学习风格的描述对角矩阵的记法酉矩阵unitary matrix性质Moore-Penrose 伪逆矩阵的逆和线性方程组的解(review)伪逆应用迹运算方阵行列式和…

代谢组+转录组分析为腰果树果实发育成熟过程中代谢网络提供见解

文章标题&#xff1a;Metabolomic and transcriptomic analyses provide insights into metabolic networks during cashew fruit development and ripening 发表期刊&#xff1a;Food Chemistry 影响因子&#xff1a;9.231 作者单位&#xff1a;海南大学 百趣生物提供服务…

推荐系统[八]算法实践总结V0:腾讯音乐全民K歌推荐系统架构及粗排设计

1.前言:召回排序流程策略算法简介 推荐可分为以下四个流程,分别是召回、粗排、精排以及重排: 召回是源头,在某种意义上决定着整个推荐的天花板;粗排是初筛,一般不会上复杂模型;精排是整个推荐环节的重中之重,在特征和模型上都会做的比较复杂;重排,一般是做打散或满足…

Docker--------Day1

1.简介 您要如何确保应用能够在这些环境中运行和通过质量检测&#xff1f;并且在部署过程中不出现令人头疼的版本、配置问题&#xff0c;也无需重新编写代码和进行故障修复&#xff1f; Docker之所以发展如此迅速&#xff0c;也是因为它对此给出了一个标准化的解决方案-----…

【牛客刷题专栏】0x0B:JZ3 数组中重复的数字(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录前言问题…