Redireccion de salida de programas

Alvaro Herrera alvherre en dcc.uchile.cl
Jue Jun 24 17:54:53 CLT 2004


On Thu, Jun 24, 2004 at 04:43:59PM -0400, Paulo Seguel wrote:
> Carlos Manuel Duclos Vergara wrote:
> >>>ls -lR > archivo
> >>
> >>No pues, ya ejecute "ls -lR" y esta en medio de toda esa salida.
> >>
> >>El asunto es que no quiero/puedo cortar el proceso y quiero que empieze a 
> >>tirar la salida a otro lado.

Tu solucion seria mandar un SIGSTOP al proceso, meterte en su tabla de
descriptores y cambiar el 1 y 2 (stdout y stderr).  Lo segundo
probablemente necesita algunas llamadas al kernel que no existan -- dudo
que puedas alterar /proc/<pid>/fd/1, por ejemplo.  Meterte en la memoria
del kernel seria una solucion ... aunque francamente dudo que quieras
hacer eso.

(En Log.pm hay un hack para abrir stderr en un archivo en /tmp AFAIR)

> >el problema es que es una imposibilidad "fisica"!
> >el proceso B (ls -lR en este caso) fue creado por el proceso A (bash o el 
> >shell correspondiente). [...]
> 
> Me quedo claro, pero entonces como los procesos que estan a la salida de 
> otro pueden comunicarse? bueno, eso prefiero buscarlo en la red.

Para eso abren pipes o sockets _antes_.  Mira por ejemplo la llamada
pipe(2); luego haces fork(), cierras el extremo de lectura en un proceso
y el extremo de escritura en el otro, y asi el primero le puede hablar
al segundo.  Y si lo haces dos veces en sentidos opuestos, tienes
comunicacion bidireccional (pero es dificil manejar eso limpiamente!! es
decir, como impides que cada uno se bloquee esperando al otro?  Un
deadlock es muy facil de conseguir en esta situacion).

Si a eso le an~ades un par de llamadas a dup() o dup2(), puedes cambiar
stderr/stdout/stdin con los extremos del pipe.

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"Aprende a avergonzarte más ante ti que ante los demás" (Demócrito)



Más información sobre la lista de distribución Linux