🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: es.comp.os.linux.programacion
6 messages
6 total messages Started by ADnoctum Fri, 10 Sep 1999 00:00
Pipes
#18422
Author: ADnoctum
Date: Fri, 10 Sep 1999 00:00
6 lines
729 bytes
En el shel yo puedo hacer algo como

$ miprograma | less

C�mo puedo hacer que mi programa llame a less para que la salida sea por
pantallas.
Re: Pipes
#18347
Author: Alex the Hero
Date: Sun, 12 Sep 1999 00:00
23 lines
1357 bytes
ADnoctum escribi�:

> En el shel yo puedo hacer algo como
>
> $ miprograma | less
>
> C�mo puedo hacer que mi programa llame a less para que la salida sea por
> pantallas.

No es exactamente lo que tu quieres, pero se podrias resolver con un alias.
en ~/.bashrc poner alias miprograma='miprograma | less'

a falta de otra solucion ...



Arrepentiros ahora, Gates es el AntiCristo, recitemos
juntos del libro de C de los profetas Kernigan y Ritchie
capitulo 7 versiculo 8.5 : Las funciones malloc y calloc .....
  =========================
        Alex The Hero
  www.gratisweb.com/aide_0
  =========================
Re: Pipes
#18348
Author: Ignacio Arenaza
Date: Sun, 12 Sep 1999 00:00
15 lines
1275 bytes
>>>>> "ADnoctum" == ADnoctum  <adnoctum@graffiti.net> writes:

    ADnoctum> En el shel yo puedo hacer algo como $ miprograma | less

    ADnoctum> C�mo puedo hacer que mi programa llame a less para que
    ADnoctum> la salida sea por pantallas.

Echa una ojeada a la pagina del manual de la funcion 'popen' (hay
algunos ejemplos tambien en el GULP de lucas.hispalinux.es)

Saludos. I�aki.

-- 
  PGP Key available at http://personales.jet.es/inaki.arenaza/pgpkey.html
  Linux Registered User #44369
Re: Pipes
#18314
Author: *puntero_loco
Date: Thu, 16 Sep 1999 00:00
22 lines
1346 bytes
El Fri, 10 Sep 1999 16:07:35 -0500, ADnoctum <adnoctum@graffiti.net> escribi�:
|En el shel yo puedo hacer algo como
|
|$ miprograma | less
|
|C�mo puedo hacer que mi programa llame a less para que la salida sea por
|pantallas.

Puedes hacer un fork, que ejecute el less y crear una tuber�a entre el padre y
el hijo (para m�s info sobre las tuber�as m�rate la gu�a de programaci�n en
Linux), o de forma m�s cutre puedes escribir la salida de tu programa a un
archivo temporal, hacer un fork, que este nuevo proceso ejecute el less con el
archivo temporal como par�metro.


-- 
 /-----------------------------\
|      *puntero_loco            |  
|     Debian 2.1 Slink          |
|  jajsNOSPAM@retemail.es       |
| http://personal5.iddeo.es/jajs|
 \-----------------------------/
RE: Pipes
#18232
Author: 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#
Re: Pipes
#18243
Author: J.A. Gutierrez
Date: Thu, 23 Sep 1999 00:00
114 lines
3731 bytes
Juan Salvador Perez Garcia <jspgxx@teleline.es> wrote:

: 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 */

    Un ejemplo curioso que hice en tiempos:

-69.c----------------------------------------------------------------------
/*
 * (c) SPDsoft 1994
 * 24 julio 1994
 *
 * Launch two processes:
 *              output cmd[0] -> input cmd[1]
 *              input cmd[0] <- output cmd[1]
 */

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>

main(int argc, char **argv)
{
    pid_t       pid;
    int     pipefd[2][2];
    int     i;
    char        **cmd[2];
    extern int  errno;
    char        strerr[256];

    cmd[0] = &argv[1];
    cmd[1] = NULL;

    for(i=1; ( i<argc)&&(strcmp(argv[i],";")!=0); i ++)
    ;

    if ( i < argc -1 )
    {
        argv[i] = (char*) 0;
        cmd[1] = &argv[i+1];
    }


    if  (( argc < 4 ) || ( cmd[1] == NULL ))
    {
        sprintf(strerr,
        "%s: SPDsoft 1994: Sixty-nine two processes\n"
        "Usage: %s cmd1 [args] ; cmd2 [args]\n",
        argv[0] , argv[0]);

        write(2, strerr, strlen(strerr));
        exit(-1);
    }

    pipe (pipefd[0]);
    pipe (pipefd[1]);


    if ((pid = fork()) == (pid_t)0)
    {
        close(0);
        close(1);

        dup (pipefd[1][0]);
        dup (pipefd[0][1]);
        close (pipefd[0][0]);
        close (pipefd[1][1]);

        execvp(*cmd[0], cmd[0]);
        sprintf(strerr,"%s: Can't execvp %s (%s)\n",
        argv[0], *cmd[0], strerror(errno));
        write(2, strerr, strlen(strerr));
        exit(errno);
    }
    else if (pid > (pid_t)0)
    {
        close(0);
        close(1);

        dup (pipefd[0][0]);
        dup (pipefd[1][1]);
        close (pipefd[1][0]);
        close (pipefd[0][1]);

        execvp(*cmd[1], cmd[1]);
        sprintf(strerr,"%s: Can't execvp %s (%s)\n",
        argv[0], *cmd[1], strerror(errno));
        write(2, strerr, strlen(strerr));
        exit(errno);
    }
    else
        perror("fork");
        exit(errno);
}
---------------------------------------------------------------------------
-- 
PGP and other useless info at      \                      Oh, show us the way
http://www.cps.unizar.es/~spd/      \                  to the next whisky bar
finger://daphne.cps.unizar.es/spd    \                           Weill/Bretch
Lo que si que es cierto es que la felicidad no da el dinero...
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads