🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: controlar un programa desde otro

#13
From: chizpazbt
Date: Wed, 02 Oct 2002 17:46
84 lines
4166 bytes
Esto es bastante sencillo:

En unix/linux resulta que el descriptor asociado con la entrada est�ndar
tiene el valor  0 y la salida est�ndar
tiene el valor 1 (o al rev�s) (m�ralo en el manual).  Me explico: Supongamos
que la salida est�ndar tiene el valor 0:

write(0,"hola\n",strlen("hola\n"));
    es ex�ctamente lo mismo que poner
printf("hola\n");

(lo mismo con read() y scanf(), teniendo en cuenta que la entrada est�ndar
tomar�a el valor 1;

Dicho de otra forma: s�lo tienes que asociar tu tuber�a con los descriptores
de fichero de entrada/salida est�ndar....

Salu2



"Lepton" <reinob@jazzfree.com> escribi� en el mensaje
news:Pine.LNX.4.44.0210021725480.3140-100000@lorien.local...
>
> [ 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: <anfb6p$5tv$1@cabezon.cpd.uva.es>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!proxad.net!isdnet!news.rediris.es!news.uva.es!not-for-mail
References: <Pine.LNX.4.44.0210021725480.3140-100000@lorien.local>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f4463,f557a5b44ea0d9c4
X-Google-Attributes: gidf4463,public
X-Google-Thread: f86c8,f557a5b44ea0d9c4
X-Google-Attributes: gidf86c8,public
X-Google-ArrivalTime: 2002-10-02 10:46:49 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!proxad.net!isdnet!news.rediris.es!news.uva.es!not-for-mail
From: "chizpazbt" <chizpazbt@mixmail.com>
Newsgroups: es.comp.os.linux.programacion,es.comp.hackers
Subject: Re: controlar un programa desde otro
Date: Wed, 2 Oct 2002 19:46:39 +0200
Organization: Universidad de Valladolid - Spain
Lines: 86
Message-ID: <anfb6p$5tv$1@cabezon.cpd.uva.es>
References: <Pine.LNX.4.44.0210021725480.3140-100000@lorien.local>
NNTP-Posting-Host: 2l010x18.tel.uva.es
X-Trace: cabezon.cpd.uva.es 1033580569 6079 157.88.128.243 (2 Oct 2002 17:42:49 GMT)
X-Complaints-To: abuse@uva.es
NNTP-Posting-Date: Wed, 2 Oct 2002 17:42:49 +0000 (UTC)
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2600.0000
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000