Dejaron unas pequeñas explicaciones con la creación de procesos y demás:
http://petra.euitio.uniovi.es/asignaturas/sis.ope/material/practicas/wys.pdf
Las redirecciones en Unix son un pelín complicadas, pero son relativamente lógicas.
Tienes una tabla de descriptores de ficheros, y las tres primeras entradas son la entrada estándar (0,stdin), la salida estándar (1,stdout), y la salida de errores estándar (2,stderr).
Lo que debes hacer es modificar la tabla, para que en vez de apuntar a lo que suelen apuntar (teclado la primera, y consola las otras dos), que apunten a un fichero. Para ello, en el caso de las salidas debes crear un fichero como escritura, y en la entrada abrirlo como lectura. Una vez hecho esto, lo más sencillo, es cerrar el descriptor de fichero que quieras modificar (0, 1 ó 2), y duplicar el descriptor del fichero al que redirijas. Al duplicarlo, se buscará la entrada de la tabla que se encuentre vacía. Como acabas de cerrar uno de los primeros, se duplicará allí. Así, cada vez que se haga una lectura/escritura en ese descriptor, se hará en el fichero. Y entonces puedes cerrar el descriptor del fichero creado, no lo necesitas más.
Esto tiene un problema, y es que haciéndolo así, no tienes forma de volver a la redirección anterior (a la consola), así que antes de hacerla, debes de guardar los descriptores originales. La manera de hacerlo, es duplicarlos a ellos también, y apuntar en que posición de la tabla se han guardado. Cuando ya no necesites la redirección, basta con volver a hacer la redirección, utilizando esos fd's.
Para crear el fichero o abrirlo, yo uso siempre open(), pero con diferentes flags, O_RDONLY para lectura, y O_WRONLY|O_CREAT|O_TRUNC para la escritura (sólo escritura, crear el fichero si no existe, y truncarlo si existe).
Para duplicar una entrada de la FDT, se usa dup(), se le pasa la posición de la tabla a duplicar, y devuelve la nueva posición de la copia.
Y para cerrar un FD, con close().
Una vez que se tenga esto, es hacer lo que dije antes:
-Abrimos el fichero a donde se hará la redirección.
-Duplicaremos el FD que queremos redireccionar (yo uso las macros STDOUT_FILENO, etc, no uso los números directamente), y guardamos la posición de la copia
-Cerramos el descriptor original
-Duplicamos el descriptor del fichero abierto, creándose la copia donde estaba la estándar (no es necesario guardar donde se copia

)
-Cerramos el descriptor del fichero (el que nos devolvió open)
Para resdirigir:
-Cerramos descriptor
-Duplicamos el original (que teníamos guardado)
-Cerramos la copia que teníamos.
Y ya está