美文网首页
dup2 重定向捕获日志

dup2 重定向捕获日志

作者: monkey姜啦 | 来源:发表于2020-04-14 20:00 被阅读0次

    1、介绍

    NSLog最后重定向的句柄是STDERR,NSLog输出的日志内容,最终都通过STDERR句柄来记录,而dup2函数式专门进行文件重定向的;
    可以使用dup2重定向STDERR句柄,将内容重定向指定的位置,如写入文件,上传服务器,显示到View上。
    2、核心代码

    实现重定向,需要通过NSPipe创建一个管道,pipe有读端和写端,然后通过dup2将标准输入重定向到pipe的写端。再通过NSFileHandle监听pipe的读端,最后再处理读出的信息。
    之后通过printf或者NSLog写数据,都会写到pipe的写端,同时pipe会将这些数据直接传送到读端,最后通过NSFileHandle的监控函数取出这些数据。

    - (void)showMsg{
        [self redirectSTD:STDERR_FILENO];
    }
    
    - (void)redirectSTD:(int )fd {
        
        NSPipe * pipe = [NSPipe pipe] ;
        NSFileHandle *pipeReadHandle = [pipe fileHandleForReading] ;
        int pipeFileHandle = [[pipe fileHandleForWriting] fileDescriptor];
        dup2(pipeFileHandle, fd) ;
        
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(redirectNotificationHandle:)
                                                     name:NSFileHandleReadCompletionNotification
                                                   object:pipeReadHandle] ;
        [pipeReadHandle readInBackgroundAndNotify];
    }
     
    - (void)redirectNotificationHandle:(NSNotification *)nf {
        NSData *data = [[nf userInfo] objectForKey:NSFileHandleNotificationDataItem];
        NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] ;
        self.textView.text = str;
        [[nf object] readInBackgroundAndNotify];
    }
    

    参考:https://blog.csdn.net/weixin_34240657/article/details/91362174

    相关文章

      网友评论

          本文标题:dup2 重定向捕获日志

          本文链接:https://www.haomeiwen.com/subject/nbkxvhtx.html