如何将打印的log,输出到文本文件中

前言

在调试adb的时候,对于HOST端的log信息,有些能打印出来,但是有些却不能打印出来。经过查找,发现在代码中,有start_logging()这样的一个方法。这个方法,导致没有信息的输出,它将信息写入了文件 。
一下代码经过简单修改后的代码,需要原始的代码可以查看adb.c这个文件。

正文

函数代码

void start_logging(void)
{
    int fd;
    fd = open("/dev/null", O_RDONLY);
    dup2(fd, 0);
    close(fd);

    fd = open("./loginfo.log", O_WRONLY | O_CREAT | O_APPEND, 0640);
    if(fd < 0) {
        fd = open("/dev/null", O_WRONLY);
    }
    dup2(fd, 1);
    dup2(fd, 2);
    close(fd);
}

分析

  • 打开/dev/null这个空设备,对于/dev/null这个空设备,其接收一切的数据,并不发送数据。使用dup2,将这个描述符定向为0,yeh,也即是标准输入。 结合二者表明,程序不接受任何的输入信息

  • 打开当前目录下的loginfo.log文件,用来存储log信息;如果文件不存在则创建,存在则将内容追加到后边。
    如果打开失败,则将信息输出到/dev/null空设备中

  • 将打开的loginfo.log的文件句柄重定向为 1 2 ,也就是标准输出和标准错误。即表明程序中的输出信息和错误信息,将会打印到loginfo.log文件中。

函数API

#include <unsitd.h>

int dup(int oldfd);

int dup2(int oldfd,int newfd);

dup 和dup2都是返回新的描述符。

相关知识

O_RDONLY 以只读方式打开文件
O_WRONLY 以只写方式打开文件
O_RDWR 以可读写方式打开文件. 上述三种旗标是互斥的, 也就是不可同时使用。

在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF。

系统调用dup和dup2能够复制文件描述符。dup返回新的文件文件描述符(没有用的文件描述符最小的编号)。dup2可以让用户指定返回的文件描述符的值,如果需要,则首先接近newfd的值,他通常用来重新打开或者重定向一个文件描述符

参考文献

进程间通信管道进阶篇:linux下dup/dup2函数的用法
android adb.c源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值