【原】从/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...\n");
                dup2(fd,STDOUT_FILENO);
                printf("after dup2...\n");
                sleep(20);

                FILE* fp = freopen("reopen.txt","w+",stdout);

                if(fp != 0)
                {
                        fputs("fputs output ...\n",fp);
                }

                printf("printf output ...\n");
                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);
posted @ 2014-04-02 17:39  lingjip  Views(2170)  Comments(0Edit  收藏  举报