freopen("/my/newstdin", "r", stdin);
freopen("/my/newstdout", "w", stdout);
freopen("/my/newstderr", "w", stderr);
... do your stuff
freopen("/dev/stdin", "r", stdin);
...
...
Questa picchi la puntina sul mio giro-peg-piazza-hole-o-meter, che cosa stai cercando di realizzare?
Edit:
Ricordate che stdin, stdout e stderr sono descrittori di file 0, 1 e 2 per ogni processo di nuova creazione. freopen() dovrebbe mantenere lo stesso valore di fd, basta assegnargli nuovi stream.
Quindi, un buon modo per garantire che questo sta effettivamente facendo quello che vuoi da fare sarebbe:
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));
Credo che questo sia il comportamento previsto freopen(), come si può vedere, è Stai ancora usando solo tre descrittori di file (e flussi associati).
Ciò sostituirà qualsiasi reindirizzamento della shell, in quanto non ci sarebbe nulla da reindirizzare per la shell. Tuttavia, probabilmente sta andando a rompere i tubi. Potresti voler impostare un gestore per SIGPIPE, nel caso in cui il tuo programma si trovi sul lato di blocco di una pipe (non FIFO, pipe).
Quindi, ./your_program --stdout /tmp/stdout.txt --stderr /tmp/stderr.txt deve essere facilmente realizzato con freopen() e mantenendo gli stessi descrittori di file effettivi. Quello che non capisco è il motivo per cui dovresti reinserirli una volta modificati? Sicuramente, se qualcuno passasse una delle due opzioni, vorrebbero che persistesse fino alla fine del programma?
Si noti che 'stdin',' stdout', e 'stderr' sono variabili globali. –