freopen("/my/newstdin", "r", stdin);
freopen("/my/newstdout", "w", stdout);
freopen("/my/newstderr", "w", stderr);
... do your stuff
freopen("/dev/stdin", "r", stdin);
...
...
这使我的圆头方孔O型表上的针达到峰值,您要完成什么?
编辑:
请记住,对于每个新创建的进程,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()的预期行为,如您所见,您仍然仅使用三个文件描述符(和关联的流)。
这将覆盖任何Shell重定向,因为Shell不会进行任何重定向。但是,它可能会破坏管道。您可能需要确保为SIGPIPE设置处理程序,以防程序在管道(不是FIFO,管道)的阻塞端发现自己。
因此,。/ your_program --stdout /tmp/stdout.txt --stderr /tmp/stderr.txt应该使用freopen()轻松实现,并保持相同的实际文件描述符。我不明白的是,为什么更改它们后需要将它们放回原处?当然,如果有人通过了这两个选项,他们会希望它持续到程序终止?
stdin
,stdout
和stderr
是全局变量。