Article View: es.comp.os.linux.programacion
Article #8400Re: Capturar la salida de un programa
From: J.A. Gutierrez
Date: Fri, 15 Nov 2002 19:03
Date: Fri, 15 Nov 2002 19:03
188 lines
5871 bytes
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-mailReferences:
<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))