freopen("/my/newstdin", "r", stdin);
freopen("/my/newstdout", "w", stdout);
freopen("/my/newstderr", "w", stderr);
... do your stuff
freopen("/dev/stdin", "r", stdin);
...
...
Это пиковая стрелка на моем круглом квадратном отверстии-о-метре, чего вы пытаетесь достичь?
Edit:
Помните, что stdin, stdout и stderr являются файловыми дескрипторами 0, 1 и 2 для каждого вновь создаваемого процесса. freopen () должен сохранять те же файлы, просто назначать им новые потоки.
Итак, хороший способ убедиться, что это действительно делает то, что вы хотите, это сделать:
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 () и сохранением тех же фактических файловых дескрипторов. То, что я не понимаю, это то, почему вы должны положить их обратно, когда меняете их? Конечно, если кто-то пропустит любой из этих вариантов, он захочет сохранить его до завершения программы?