Article View: es.comp.os.linux.programacion
Article #18232RE: Pipes
From: Juan Salvador Perez Garcia
Date: Wed, 22 Sep 1999 00:00
Date: Wed, 22 Sep 1999 00:00
85 lines
3629 bytes
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-mailReferences:
<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