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, pipe).
Итак, ./your_program --stdout /tmp/stdout.txt --stderr /tmp/stderr.txt должно быть легко выполнено с помощью freopen () и сохранением тех же фактических дескрипторов файлов. Чего я не понимаю, так это зачем вам нужно их возвращать после того, как поменяли их? Конечно, если кто-то выберет любой из вариантов, он захочет, чтобы он сохранялся до завершения программы?
person
Tim Post♦
schedule
25.02.2009
stdin
,stdout
иstderr
- глобальные переменные. - person Alexis Wilke   schedule 22.01.2018