freopen("/my/newstdin", "r", stdin);
freopen("/my/newstdout", "w", stdout);
freopen("/my/newstderr", "w", stderr);
... do your stuff
freopen("/dev/stdin", "r", stdin);
...
...
这使我的圆钉方孔表上的针达到顶峰,您要完成什么?
编辑:
请记住,stdin、stdout 和 stderr 是每个新创建的进程的文件描述符 0、1 和 2。freopen() 应该保持相同的 fd,只需为它们分配新的流。
因此,确保这实际上是在做你想做的事情的一个好方法是:
printf("Stdout is descriptor %d\n", fileno(stdout));
freopen("/tmp/newstdout", "w", stdout);
printf("Stdout is now /tmp/newstdout and hopefully still fd %d\n",
fileno(stdout));
freopen("/dev/stdout", "w", stdout);
printf("Now we put it back, hopefully its still fd %d\n",
fileno(stdout));
我相信这是 freopen() 的预期行为,如您所见,您仍然只使用三个文件描述符(和关联的流)。
这将覆盖任何外壳重定向,因为外壳不会重定向。但是,它可能会破坏管道。您可能希望确保为 SIGPIPE 设置一个处理程序,以防您的程序发现自己位于管道(不是 FIFO,管道)的阻塞端。
因此, ./your_program --stdout /tmp/stdout.txt --stderr /tmp/stderr.txt 应该可以使用 freopen() 轻松完成并保持相同的实际文件描述符。我不明白的是,为什么您需要在更改它们后将它们放回去?当然,如果有人通过了任何一个选项,他们会希望它一直持续到程序终止吗?