栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

stdout stderr 重定向到文件

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

stdout stderr 重定向到文件

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 
// 给 oldfd 分配一个新的描述符,返回
int dup(int oldfd);
// 给 oldfd 分配一个新的描述符 newfd,如果 newfd 已经打开,则先关闭
// 原来只有 oldfd 一个指针,现在有2个指针执行那个句柄对应的文件啦
int dup2(int oldfd, int newfd);
#include 
#include 

#include 
#include 
#include 

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-1n");

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

    restoreOutput();
    printf("IN STDOUT-2n");
}
#include 
#include 

#include 
#include 
#include 

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: %sn", 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 
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("%dn",a+b); 
	fclose(stdin);//关闭重定向输入 
	fclose(stdout);//关闭重定向输出 
	return 0; 
}
#include 
#include 
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<
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的含义解释 (全网最全,看完就懂)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1030873.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号