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() 的预期行为,正如你所看到的,你仍然只使用了三个文件描述符(和相应的流)。
这将覆盖任何 shell 重定向,因为没有东西可以被 shell 重定向。但是,它很可能会破坏管道。你可能需要确保设置 SIGPIPE 处理程序,以防你的程序发现自己处于管道的阻塞端口(不是 FIFO 管道)。
因此,./your_program --stdout /tmp/stdout.txt --stderr /tmp/stderr.txt 应该很容易地通过 freopen() 实现,并保持相同的实际文件描述符。我不明白的是,为什么你需要在改变它们后把它们放回去?毫无疑问,如果有人传递任一选项,他们希望它在程序终止之前持久化。
stdin
、stdout
和stderr
是全局变量。 - Alexis Wilke