🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Capturar la salida de un programa

#8400
From: J.A. Gutierrez
Date: Fri, 15 Nov 2002 19:03
188 lines
5871 bytes
Angel <a.lis.quita.esto@hotmail.com> wrote:
: Francisco presumiblemente dijo el dia Mar 12 Nov 2002 20:53:
:> Lo siento, pero no te entiendo. Seg�n el man de 'dup' y 'dup2', estas
:> funciones sirven para duplicar un descriptor de ficheros. No veo como
:> utilizar estas funciones en mi caso ...
:> 
:> Un saludo.
: fasles, lo pongo en pseudo-pseudo-codigo :P:
: int fdSalidaMia=open("blah.log",...)
: dup2(0,fdSalidaMia);
: exec(hijo)

: y la salida del hijo va al descriptor fdSalidaMia, que escribe en blah.log.

	me temo que eso no es correcto:

	1) si haces dup2(0...) , estas duplicando 0, que es el stdin,
	no el stdout.

	2) cuando haces un dup, es conveniente cerrar primero el
	descriptor.
	
	3) algun que otro fork/wait no estaria de mas.

	4) lo que se pide, no es que la salida del hijo sea un
	fichero; si no que la pueda leer el padre; por lo tanto,
	la llamada al sistema mas adecuada seria pipe()+dup(), no dup2().

	Ejemplo completo: (compilar y ejecutar como ./pipe /bin/ls -l / )

-8<-- pipe.c --------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <errno.h>

#define PATH_SEP    '/'

#ifdef _BSD_
# include <sys/types.h>
extern char *sys_errlist[];
# define raise(s) kill(getpid(),(s))
# define strerror(e) sys_errlist[(e)]
#endif


static char __ident[] = "@(#)(c)SPDsoft, Wed Mar 15, 1995";
#define VERS_STR        ((char*)&__ident[4])


void usage(void);
int launch( char *cmd[], int *status );
extern int errno;
char    *app;


main(int argc, char **argv )
{
    int i,
        opt,
        status;
    int quiet=0;

    extern char     *optarg;
    extern int      optind,opterr;


    if ((app = strrchr(argv[0], PATH_SEP))  != NULL)
        app = app+1;
    else
        app = argv[0];

    while ( (opt=getopt(argc,argv,"hV")) != EOF )
    {
        switch(opt)
        {
            case 'V':
                fprintf(stderr, "%s: %s\n", app, VERS_STR);
                exit(0);
                break;
            case 'h':
            default:
                usage();
                break;
        }
    }

    if ((argc-optind)<1)
                usage();

    launch(&(argv[1]),&status);
    if(status!=0)
    {
        fprintf(stderr,"%s: %s exit with %d (%s)\n",
            app, argv[1], status, strerror(status));
        exit(status);
    }

    exit(0);
}

void usage(void)
{
        fprintf(stderr,"Use: %s [-h] cmd\n", app);
        fprintf(stderr,"%s: -h : This text\n", app);
        exit(0);
}


int launch( char *cmd[], int *status )
{
    int res=0;
    int st,i;
    int pid, wpid;
    int pipefd[2];
    char    s[256];

    pipe (pipefd);

    switch ( pid = fork() )
    {
    case -1:    /* error */
            perror ( "fork" );
            res = -1;
            break;

    case 0:
            /* son */
            close(1);        /* close stdout */
            dup(pipefd[1]);  /* so first fd, which is stdout gets pipefd */
            close(pipefd[0]);

            execv ( cmd[0], &cmd[0] );
            fprintf(stderr, "%s: execv %s: %s\n",
                app, cmd[0], strerror(errno));
            exit(-2);
            break;

    default:
            close(0);        /* close stdin */
            dup(pipefd[0]);
            close(pipefd[1]);

            while ( 0<(i=read(0,s,sizeof(s))))
            {
                fprintf(stdout, "\n### CHUNK % .3d ###\n",i); fflush(stdout);
                write(1,s,sizeof(s));
            }

            *status = 0;
            while ( pid !=(wpid= wait ( &st )) )
            if (WIFSTOPPED(st))
            {
                fprintf(stderr,"%s: %s stoped %d\n",
                    app, cmd[0], WSTOPSIG(st));
                res = -6;
            }
            else if(WIFEXITED(st))
            {
                *status = WEXITSTATUS(st);
            }
            else if(WIFSIGNALED(st))
            {
                fprintf(stderr,"%s: %s signaled %d\n",
                    app, cmd[0],WTERMSIG(st));
                res = -6;
            }

            if(st&0200)
                fprintf(stderr,
                    "%s: %s core dumped\n", app, cmd[0]);

            break;

    }   /* switch */

    return res;
}

---------------------------------------------------------------------------
-- 
PGP and other useless info at      \
http://www.cps.unizar.es/~spd/      \
finger://daphne.cps.unizar.es/spd    \       Timeo Danaos et dona ferentes
ftp://ivo.cps.unizar.es/pub/          \                         (Virgilio)   
Technical Details
Message-ID: <ar3gde$mea$1@news.unizar.es>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!logbridge.uoregon.edu!isdnet!news.rediris.es!news.unizar.es!not-for-mail
References: <3DD03990.1090606@ono.com> <aqqmu8$a0v56$1@ID-148170.news.dfncis.de> <3DD15C64.2070601@ono.com> <ar2iud$ekv0k$1@ID-148170.news.dfncis.de>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f86c8,c70e8198e9aa783d
X-Google-Attributes: gidf86c8,public
X-Google-ArrivalTime: 2002-11-15 10:27:38 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!logbridge.uoregon.edu!isdnet!news.rediris.es!news.unizar.es!not-for-mail
From: "J.A. Gutierrez" <spd@daphne.cps.unizar.es>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: Capturar la salida de un programa
Date: 15 Nov 2002 19:03:10 GMT
Organization: Rank
Lines: 188
Message-ID: <ar3gde$mea$1@news.unizar.es>
References: <3DD03990.1090606@ono.com> <aqqmu8$a0v56$1@ID-148170.news.dfncis.de> <3DD15C64.2070601@ono.com> <ar2iud$ekv0k$1@ID-148170.news.dfncis.de>
NNTP-Posting-Host: daphne.cps.unizar.es
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
X-Trace: news.unizar.es 1037386990 22986 155.210.152.20 (15 Nov 2002 19:03:10 GMT)
X-Complaints-To: usenet@news.unizar.es
NNTP-Posting-Date: 15 Nov 2002 19:03:10 GMT
User-Agent: tin/1.4.5-20010409 ("One More Nightmare") (UNIX) (IRIX/6.2 (IP22))