zoukankan      html  css  js  c++  java
  • 【原】从/dev/null重新打开标准输出

    今天遇到一个程序,使用了printf输出中间的信息,我也懒得去改。由于此进程被其他进程fork之后,dup2 了标识输入输出到了/dev/null,再通过execvp装载进来。于是,为了看到输出的信息,写了一段类似如下的代码:

    #include <unistd.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    
    int main(int argc,char* argv[])
    {
            int fd = open("/dev/null", O_RDWR, 0);
    
            if(-1 != fd)
            {
                    printf("before dup2...
    ");
                    dup2(fd,STDOUT_FILENO);
                    printf("after dup2...
    ");
                    sleep(20);
    
                    FILE* fp = freopen("reopen.txt","w+",stdout);
    
                    if(fp != 0)
                    {
                            fputs("fputs output ...
    ",fp);
                    }
    
                    printf("printf output ...
    ");
                    sleep(20);
    
            }
            return 0;
    }
    
    可以进入到/proc/进程标识/fd下,ls -a 查看进程的文件描述符的变化。

    文件描述符和文件指针的转换
    FILE *中除了包含了fd信息,还包含了IO缓冲,是C标准形式,所以FILE *fd更适合跨平台。
    通过以下函数调用进行转换
    int fileno(FILE *stream);
    FILE *fdopen(int fd, const char *mode);
  • 相关阅读:
    实现跨域的几种方法
    2015-07-15
    unity3d中给GameObject绑定脚本的代码
    unity3d的碰撞检测及trigger
    区块链 (未完)
    mono部分源码解析
    量化策略分析的研究内容
    mono搭建脚本整理
    unity3d简介
    Hook技术之API拦截(API Hook)
  • 原文地址:https://www.cnblogs.com/syru/p/3641218.html
Copyright © 2011-2022 走看看