🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #12

controlar un programa desde otro

#12
From: Lepton
Date: Wed, 02 Oct 2002 15:40
60 lines
3075 bytes
[ Lo envio tambien a es.comp.hackers, ya que la idea ha
  originado alli (el servidor udp), y quiza alguien de
  alli tambien pueda ayudar :) ]

Hola,

Para un programilla que estoy haciendo, necesito ejecutar un
programa (concretamente un shell /bin/sh), de forma que su
stdin sea un pipe creado por mi, y lo mismo con su stdout (por
ahora ignoraremos el stderr..)

Mi idea era la siguiente:

Usando pipe() genero un par de descriptores (in[0] e in[1]), de
forma que yo leo de in[0] lo que el programa escribe en in[1].

De igual forma, con otro pipe() hago out[0] y out[1] de forma que
lo que yo escribo en out[1] lo lee el programa en out[0].

Por tanto, tengo que conseguir que despues del fork() pero antes
del exec() el stdin (descriptor 0) sea el mismo que out[0], y
vice-versa, que el stdout (descriptor 1) sea el mismo que in[1].

Luego yo le envio caracteres al shell escribiendo en out[1], y
leo lo que genera el shell de in[0].

El problema es que no se como hacer que stdin se asocie a otro
descriptor, y lo mismo con stdout.

He probado con esto (esto se ejecuta en el hijo, inmediatamente
despues del fork())

--<<--
    dup2(pipe_stdout[1], 0); /* shell-stdin << server-pipe_stdout[1] */
    dup2(pipe_stdin[0], 1); /* shell-stdout >> server-pipe_stdin[0] */

    execl("/bin/sh", "/bin/sh", NULL);
--<<--

Mi idea es que dup2(a,b) hace la copia de 'a' en 'b' cerrando 'b'
si fuera necesario. Asi que el primer dup2() deberia cerrar el
stdin, y hacer que stdin = pipe_stdout[1].

La segunda linea deberia cerrar stdout, y hacer que stdout sea el
mismo que pipe_stdin[0].

Hasta ahi, creo que es correcto (aunque agradeceria eternamente
cualquier cualquier aclaracion de si algo esta mal :), pero al
hacer el exec(), el shell se muere al instante.

Ahora no tengo el codigo fuente del bash a mano, pero supongo que,
si el error no es mio, debe ser cosa del bash, que intenta hacer
algo raro con los descriptores, y se muere en el intento :)

En fin, si alguien tiene alguna sugerencia, o puede apuntar el
error (si lo hubiera), que lo diga! :)

Gracias,
Lepton.
Technical Details
Message-ID: <Pine.LNX.4.44.0210021725480.3140-100000@lorien.local>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!syros.belnet.be!news.belnet.be!uni-erlangen.de!fu-berlin.de!uni-berlin.de!c-134-124-95.d.dial.de.ignite.NET!not-for-mail

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII-7-bit
X-Google-Thread: f4463,f557a5b44ea0d9c4,start
X-Google-Attributes: gidf4463,public
X-Google-Thread: f86c8,f557a5b44ea0d9c4,start
X-Google-Attributes: gidf86c8,public
X-Google-ArrivalTime: 2002-10-02 09:04:24 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!syros.belnet.be!news.belnet.be!uni-erlangen.de!fu-berlin.de!uni-berlin.de!c-134-124-95.d.dial.de.ignite.NET!not-for-mail
From: Lepton <reinob@jazzfree.com>
Newsgroups: es.comp.os.linux.programacion,es.comp.hackers
Subject: controlar un programa desde otro
Date: Wed, 2 Oct 2002 17:40:01 +0200
Lines: 61
Message-ID: <Pine.LNX.4.44.0210021725480.3140-100000@lorien.local>
NNTP-Posting-Host: c-134-124-95.d.dial.de.ignite.net (62.134.124.95)
Mime-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
X-Trace: fu-berlin.de 1033574662 14738844 62.134.124.95 (16 [130846])
X-Orig-Path: localhost!reinob