今天遇到一个程序,使用了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);