stdout stderr 重定向到文件

2023-05-16

1. stdout/stderr 重定向

  • 1. stdout/stderr 重定向
    • 1.1. dup/dup2 重定向到已打开文件 或 新文件
    • 1.2. freopen 重定向到新文件
    • 1.3. 命令行重定向
    • 1.4. 参考资料

1.1. dup/dup2 重定向到已打开文件 或 新文件

// https://www.man7.org/linux/man-pages/man2/dup.2.html
#include <unistd.h>
// 给 oldfd 分配一个新的描述符,返回
int dup(int oldfd);
// 给 oldfd 分配一个新的描述符 newfd,如果 newfd 已经打开,则先关闭
// 原来只有 oldfd 一个指针,现在有2个指针执行那个句柄对应的文件啦
int dup2(int oldfd, int newfd);
#include <stdio.h>
#include <unistd.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int mOldStdout = -1;
int mNewStdout = -1;

// stdout 输出 到文件中
void dupOutput(char * filename)
{
    mNewStdout = open(filename, O_CREAT|O_WRONLY|O_APPEND|O_SYNC, S_IRWXU|S_IRWXG|S_IROTH);
    mOldStdout = dup(STDOUT_FILENO);

    fsync(STDOUT_FILENO);
    dup2(mNewStdout, STDOUT_FILENO); // STDOUT_FILENO 指向 mNewStdout 文件,stdout 输出就会写到文件里
}

// 还原 stdout 到 命令窗口
void restoreOutput()
{
    fsync(STDOUT_FILENO);

    dup2(mOldStdout, STDOUT_FILENO);
    close(mOldStdout);
    close(mNewStdout);
}

int main(int argc, char * argv[]) {
    printf("IN STDOUT-1\n");

    dupOutput("logfile");
    printf("IN LOGFILE-1\n");

    restoreOutput();
    printf("IN STDOUT-2\n");
}
#include <stdio.h>
#include <unistd.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

static FILE *logHandel = NULL;

int src_stdout = -1; // 一般 stdout 的 handel 是 1. stderr 是 2
int src_stderr = -1; // 一般 stdout 的 handel 是 1. stderr 是 2

void dupOutput(int fd)
{
    src_stdout = dup(STDOUT_FILENO);   // 保持老的 handle,用于恢复
    src_stderr = dup(STDERR_FILENO);
    fsync(STDOUT_FILENO);
    fsync(STDERR_FILENO);
    dup2(fd, STDOUT_FILENO);  // 把 STDOUT_FILENO 指向 fd 句柄
    dup2(fd, STDERR_FILENO);
}

void restoreOutput(int fd)
{
    fsync(STDOUT_FILENO);
    fsync(STDERR_FILENO);
    dup2(src_stdout, STDOUT_FILENO);  // STDOUT_FILENO 指向原来的 handle
    dup2(src_stderr, STDERR_FILENO);
    close(src_stdout);
    close(src_stderr);
}

int log_set_path(const char *path)
{
    if (access(path, F_OK | W_OK) == 0) {
        logHandel = fopen(path, "a+");
    }
    if (!logHandel) {
        printf("open log file(%s) error: %s\n", path, strerror(errno));
        return errno;
    }
    dupOutput(fileno(logHandel));
    return 0;
}

1.2. freopen 重定向到新文件

FILE *freopen(char *filename, char *type, FILE *stream);

freopen 类似于 fopen+dup2, 同时包含打开和重定向功能

#include <stdio.h>
int main() 
{ 
	int a,b; 
	freopen("D:\\in.txt","r",stdin); //输入重定向,输入数据将从D盘根目录下的in.txt文件中读取 
	freopen("D:\\out.txt","w",stdout); //输出重定向,输出数据将保存在D盘根目录下的out.txt文件中 
	while(scanf("%d %d",&a,&b)!=EOF) 
	printf("%d\n",a+b); 
	fclose(stdin);//关闭重定向输入 
	fclose(stdout);//关闭重定向输出 
	return 0; 
}

#include <stdio.h>
#include <iostream>
int main()
{ 
	int a,b; 
	freopen("D:\\in.txt","r",stdin); //输入重定向,输入数据将从D盘根目录下的in.txt文件中读取 
	freopen("D:\\out.txt","w",stdout); //输出重定向,输出数据将保存在D盘根目录下的out.txt文件中 
	while(cin>>a>>b) 
	cout<<a+b<<endl; // 注意使用endl 
	fclose(stdin);//关闭重定向输入
	fclose(stdout);//关闭重定向输出 
	return 0; 
}

1.3. 命令行重定向

这里主要是重定向符号的使用

新建文件 > 追加文件 >>
nohup java -jar app.jar >log 2>&1 &
简写 nohup java -jar app.jar &>log &

1.4. 参考资料

  • C/C++ redirect stdout
  • C/C++中的freopen()函数使用详解
  • Linux shell中2>&1的含义解释 (全网最全,看完就懂)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stdout stderr 重定向到文件 的相关文章

随机推荐

  • 关于VM一启动虚拟机电脑就重启或蓝屏的几个解决方法

    最近在刚开始学习Linux在使用VMware创建新的虚拟机时只要一点启动虚拟机电脑就直接重启了 xff0c 最开始以为是vm版本或者是Linux镜像的原因来来回回换了好几个vm和Linux xff0c 电脑重启了二三十次都没成功启动虚拟机
  • Golang + Qt5 桌面开发终极解决方案

    Golang 43 Qt5 桌面开发终极解决方案 首先要安装Qt和Golang 一 安装前准备 1 下载Go1 4版本的压缩包版本 xff0c 解压至C盘User目录下 2 安装MinGW 并配置相关环境变量 参考链接 xff1a MinG
  • Oracle snapper ASH监控工具

    Oracle snapper ASH监控工具 snapper工具是由国外技术人员 xff0c 将基于Oracle ash技术原理用来监控数据库会话的负载情况 比较适合小范围时间监控 xff0c 可以生成多个快照 xff0c 例如1小时内 x
  • Matlab之数据筛选

    Matlab功能强大 xff0c 这里介绍一些数据筛选方法 xff0c 至少让其达到Excel的数据筛选程度 一 从多维数组中取某些行或列组合为新数组 示例如下 xff1a 取某些列组成新数组 newdata span class toke
  • kurento-room的搭建教程,绝对可行

    目前网上参考的kurento room的搭建教程 xff0c 比如https blog csdn net u010602143 article details 106670864 已经跑不起了 我估计原来也跑不起 原因很简单 xff0c k
  • Python 爬取携程所有机票

    打开携程网 xff0c 查询机票 xff0c 如广州到成都 这时网址为 xff1a http flights ctrip com booking CAN CTU day 1 html DDate1 61 2018 06 15 其中 xff0
  • Rust Web框架warp使用

    目录 简介快速开始Request和Response从path和body中获取参数从query中获取参数 设置状态码 静态文件 目录websocket重定向tls 简介 warp是一个超级便捷 可组合 速度极快的异步Web框架 目前最新版本为
  • CCNP路由实验之四 动态路由协议之EIGRP

    CCNP 路由实验之四 动态路由协议之 EIGRP 动态路由协议可以自动的发现远程网络 xff0c 只要网络拓扑结构发生了变化 xff0c 路由器就会相互交换路由信息 xff0c 不仅能够自动获知新增加的网络 xff0c 还可以在当前网络连
  • C++中typedef用法说明

    typedef声明提供了一种将标识符声明为类型别名的方法 xff0c 用于替换复杂的类型名 解释 在声明中使用typedef说明符时 xff0c 会指定这个声明是typedef声明 xff0c 而不是变量或函数声明 通常 xff0c typ
  • Ubuntu 服务配置(sysv-rc-conf)

    版权声明 xff1a 本文为博主原创文章 xff0c 未经博主允许不得转载 sudo apt get install sysv rc conf sudo sysv rc conf 运行级别说明 xff1a S表示开机后就会运行的服务0表示关
  • 安装vnc的各种悲剧解决

    系统 环境 VM 43 RHEL5 1 root 64 localhost vnc uname r 2 6 18 53 el5xen 本地XP系统安装 VNCVIEW去控制VM中的RHEL5 1 下面在LINUX上安装VNCSERVER 1
  • iOS基础 UITabBarController

    使用 创建子控制器继承自UITabBarController xff0c 在viewDidLoad阶段 xff0c 把各个分页上的控制器给创建好 xff0c 用UITabBarController的方法addChildControoler相
  • 插入内核模块失败提示"Invalid module format"

    产品需要编译自己的定制内核 43 内核模块 xff0c 下载内核源码定制修改后rpmbuild方式 点击打开链接 编译升级内核 xff0c 如下方式编译内核模块 make C kernel source SUBDIRS 61 96 pwd
  • microsoft visual c++ build tools

    因为visual studio的安装包太大 xff0c 所以在不需要开发的情况下 xff0c 可以选择使用microsoft visual c 43 43 build tools安装c 43 43 编译器 xff0c 这个工具会小很多 安装
  • C++ 应用程序 内存结构 --- BSS段,数据段,代码段,堆内存和栈

    转自 xff1a http hi baidu com C6 BF D6 D0 B5 C4 C5 AE CE D7 blog item 5043d08e741075f3503d922c html ld 时把所有的目标文件的代码段组合成一个代码
  • 4.1 简单题 - B 恭喜你

    当别人告诉你自己考了 x 分的时候 xff0c 你要回答说 xff1a 恭喜你考了 x 分 xff01 比如小明告诉你他考了90分 xff0c 你就用汉语拼音打出来 gong xi ni kao le 90 fen 输入格式 xff1a 输
  • <script>在页面代码上没有显示

    记录一下 导入js文件 xff0c 自己路径都没有问题 xff0c 为什么在浏览器查看页面代码没有自己写的那行js导入文件的代码呢 xff0c 原来 xff0c 是之前看着不舒服 xff0c 点了exclude xff0c exclude是
  • 利用Rust构建一个REST API服务

    利用Rust构建一个REST API服务 关注公众号 xff1a 香菜粉丝 了解更多精彩内容 Rust 是一个拥有很多忠实粉丝的编程语言 xff0c 还是很难找到一些用它构建的项目 xff0c 而且掌握起来甚至有点难度 想要开始学习一门编程
  • 安装cmake3.22

    升级cmake版本 脚本 span class token assign left variable file name span span class token operator 61 span cmake 3 22 0 yum era
  • stdout stderr 重定向到文件

    1 stdout stderr 重定向 1 stdout stderr 重定向 1 1 dup dup2 重定向到已打开文件 或 新文件1 2 freopen 重定向到新文件1 3 命令行重定向1 4 参考资料 1 1 dup dup2 重