🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

RE: Pipes

#18232
From: Juan Salvador Perez Garcia
Date: Wed, 22 Sep 1999 00:00
85 lines
3629 bytes
ADnoctum <adnoctum@graffiti.net> escribi� en el mensaje de noticias
7rh37t$vj6$1@batcher.rediris.es...
> En el shel yo puedo hacer algo como
>
> $ miprograma | less
>

Buff!, tendre que desempolvar mis conocimientos sobre S.O. Creo que era algo
asi:

/* Desde tu programa */
int pid; /* Para el fork -> Identificador de proceso */
int fd[2];  /* Para el pipe -> Cada entero es un identificador de fichero. 0
es para leer y 1 es para
                   escribir ( o viceversa, ya te he dicho que no me acuerdo
muy bien */

/* Puede que la llamada tenga mas parametros o que devuelva algo */
pipe(fd); /* Creamos un pipe */
pid = fork();
if (pid != 0) /* Codigo que ejecuta el padre */
{
   close(1); /* Cerramos la salida estandard del programa */

   /* Podria llamares de otra forma, lo importante es que al duplicarse el
id. de fichero el id. duplicado (clon?) se coloca en la primera posicion
vacia de la tabla de id. de ficheros del proceso. en este caso 1 que es la
salida estandard la cual hemos cerrado. Ahora la salida estandard del
proceso es la entrada del pipe */
   dup(fd[0]);

close(fd[0]); /* Cerramos la entrada del pipe aunque no la perdemos ya que
la tenemos duplicada
                         en la posicion 1 de la tabla de identificadores */

/* Hacemos algo que genere la salida */
}
else /* Codigo proceso hijo */
{
 close(0); /* Hacemos la misma operacion para el proceso hijo pero con la
entrada estandard */
 dup(fd[1]);
 close(fd[1]);

 /* Ahora la salida estandard del proceso 1 esta conectada mediante un pipe
a la entrada estandard del proceso 2 */

/* No se exactamente que paramentros tiene exec, de todas formas lo
importante es que a pesar de ejecutar exec el programa que se ejecuta hereda
la tabla de id. de ficheros del proceso por lo que tiene conectada la
entrada estandard a la salida del proceso 1 */
exec("less", ...);
}


...


voila!  incluso puede ser que funcione.

De todas formas, a este codigo falta comprobarle las siguientes cosas:

que id. tiene la salida y la entrada estandard.
si en el pipe fd[0] es de escritura y fd[1] es de lectura o viceversa.
Si la llamada a pipe es correcta.
Sintaxis de la llamada exec.
Debes matar al proceso hijo cuando este termine su ejecucion si no te
quedaran procesos zombies en el sistema. Esto se hace mediante la llamada
wait(&status) donde status es el codigo de finalizacion del proceso hijo.

y seguramente algo mas que me dejo en el teclado (tintero ;-) )

De todas formas mirate la guia de programacion para linux o, si estabas
pensando en realizar una inversion de futuro comprate el Unix Programacion
Avanzada de la editorial Ra-Ma es Muy Bueno!
(yo lo utilice para mis practicas de Fundamentos de S.O y Dise�o de S.O y
oye, sin problema. (Publicidad!: El libro incluye pipes, tratamiento de
se�ales, procesos, mecanismos ipc ( semaforos, zonas de memoria compartida,
paso de mensajes,...),  sockets Unix y sockets tcp/ip,etc etc etc etc.

bueno, ya me contaras

salva_perez@(quitaEsto)hotmail.com
Usuario Registrado: #139516#
Technical Details
Message-ID: <7sacpi$1vn$1@talia.mad.ttd.net>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <7rh37t$vj6$1@batcher.rediris.es>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f86c8,5846027b06c115db
X-Google-Attributes: gidf86c8,public
From: "Juan Salvador Perez Garcia" <jspgxx@teleline.es>
Subject: RE: Pipes
Date: 1999/09/22
Message-ID: <7sacpi$1vn$1@talia.mad.ttd.net>
X-Deja-AN: 528409677
References: <7rh37t$vj6$1@batcher.rediris.es>
X-Priority: 3
X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2014.211
Organization: Telefonica Transmision de Datos
X-MSMail-Priority: Normal
Newsgroups: es.comp.os.linux.programacion