【原】从/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);

浙公网安备 33010602011771号