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)

