J'aimerais comprendre quand employer la combinaison fork et pipe, ou
employer popen.
En effet, je souhaiterais écrire un petit frontend à wget, et à cet
occasion, j'aimerais capturer la sortie de wget en train de télécharger
(donc, la barre de progression). Si vous connaissiez un programme
réalisant cela (donc, la récupération et le traitement d'une sortie
complexe d'un programme), je suis preneur.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
DINH Viêt Hoà
J'aimerais comprendre quand employer la combinaison fork et pipe, ou employer popen. En effet, je souhaiterais écrire un petit frontend à wget, et à cet occasion, j'aimerais capturer la sortie de wget en train de télécharger (donc, la barre de progression). Si vous connaissiez un programme réalisant cela (donc, la récupération et le traitement d'une sortie complexe d'un programme), je suis preneur.
popen() est plus facile à utiliser, mais ne te permets pas de faire à la fois les indirections stdin et stdout. popen() fait une indirection dans un seul sens.
fork() et pipe() sont à utiliser impérativement dans ce cas-là.
J'aimerais comprendre quand employer la combinaison fork et pipe, ou
employer popen.
En effet, je souhaiterais écrire un petit frontend à wget, et à cet
occasion, j'aimerais capturer la sortie de wget en train de télécharger
(donc, la barre de progression). Si vous connaissiez un programme
réalisant cela (donc, la récupération et le traitement d'une sortie
complexe d'un programme), je suis preneur.
popen() est plus facile à utiliser, mais ne te permets pas de faire à la
fois les indirections stdin et stdout. popen() fait une indirection dans
un seul sens.
fork() et pipe() sont à utiliser impérativement dans ce cas-là.
--
DINH V. Hoa,
etPan! - newsreader, mail user agent -- http://libetpan.sf.net/etpan
J'aimerais comprendre quand employer la combinaison fork et pipe, ou employer popen. En effet, je souhaiterais écrire un petit frontend à wget, et à cet occasion, j'aimerais capturer la sortie de wget en train de télécharger (donc, la barre de progression). Si vous connaissiez un programme réalisant cela (donc, la récupération et le traitement d'une sortie complexe d'un programme), je suis preneur.
popen() est plus facile à utiliser, mais ne te permets pas de faire à la fois les indirections stdin et stdout. popen() fait une indirection dans un seul sens.
fork() et pipe() sont à utiliser impérativement dans ce cas-là.
popen() est plus facile à utiliser, mais ne te permets pas de faire à la fois les indirections stdin et stdout. popen() fait une indirection dans un seul sens.
fork() et pipe() sont à utiliser impérativement dans ce cas-là.
Donc, si je comprend bien, si je dois uniquement traiter uniqement la sortie, je peux me contenter de popen. Par contre, si je dois commencer à gérer à la fois l'entrée standard du programme appartenant au pipe et sa sortie standard, je devrai impérativement utiliser fork et pipe.
DINH Viêt Hoà wrote:
popen() est plus facile à utiliser, mais ne te permets pas de faire à la
fois les indirections stdin et stdout. popen() fait une indirection dans
un seul sens.
fork() et pipe() sont à utiliser impérativement dans ce cas-là.
Donc, si je comprend bien, si je dois uniquement traiter uniqement la
sortie, je peux me contenter de popen. Par contre, si je dois commencer
à gérer à la fois l'entrée standard du programme appartenant au pipe et
sa sortie standard, je devrai impérativement utiliser fork et pipe.
popen() est plus facile à utiliser, mais ne te permets pas de faire à la fois les indirections stdin et stdout. popen() fait une indirection dans un seul sens.
fork() et pipe() sont à utiliser impérativement dans ce cas-là.
Donc, si je comprend bien, si je dois uniquement traiter uniqement la sortie, je peux me contenter de popen. Par contre, si je dois commencer à gérer à la fois l'entrée standard du programme appartenant au pipe et sa sortie standard, je devrai impérativement utiliser fork et pipe.
DINH Viêt Hoà
DINH Viêt Hoà wrote:
popen() est plus facile à utiliser, mais ne te permets pas de faire à la fois les indirections stdin et stdout. popen() fait une indirection dans un seul sens.
fork() et pipe() sont à utiliser impérativement dans ce cas-là.
Donc, si je comprend bien, si je dois uniquement traiter uniqement la sortie, je peux me contenter de popen. Par contre, si je dois commencer à gérer à la fois l'entrée standard du programme appartenant au pipe et sa sortie standard, je devrai impérativement utiliser fork et pipe.
popen() est plus facile à utiliser, mais ne te permets pas de faire à la
fois les indirections stdin et stdout. popen() fait une indirection dans
un seul sens.
fork() et pipe() sont à utiliser impérativement dans ce cas-là.
Donc, si je comprend bien, si je dois uniquement traiter uniqement la
sortie, je peux me contenter de popen. Par contre, si je dois commencer
à gérer à la fois l'entrée standard du programme appartenant au pipe et
sa sortie standard, je devrai impérativement utiliser fork et pipe.
voilà.
--
DINH V. Hoa,
etPan! - newsreader, mail user agent -- http://libetpan.sf.net/etpan
popen() est plus facile à utiliser, mais ne te permets pas de faire à la fois les indirections stdin et stdout. popen() fait une indirection dans un seul sens.
fork() et pipe() sont à utiliser impérativement dans ce cas-là.
Donc, si je comprend bien, si je dois uniquement traiter uniqement la sortie, je peux me contenter de popen. Par contre, si je dois commencer à gérer à la fois l'entrée standard du programme appartenant au pipe et sa sortie standard, je devrai impérativement utiliser fork et pipe.
Un grand merci ! Je vais maintenant essayer de voir comment gérer tout cela ;-))
amaguk
Eric Jacoboni
DINH Viêt Hoà writes:
popen() est plus facile à utiliser, mais ne te permets pas de faire à la fois les indirections stdin et stdout. popen() fait une indirection dans un seul sens.
J'avoue ne jamais avoir essayé d'utiliser popen() comme ça, mais, d'après le man de cette fonction sur FreeBSD :
The popen() function ``opens'' a process by creating a bidirectional pipe forking, and invoking the shell.
et, plus loin :
The type argument is a pointer to a null-terminated string which must be `r' for reading, `w' for writing, or `r+' for reading and writing.
-- Éric Jacoboni, né il y a 1377271607 secondes
DINH Viêt Hoà <dinh.viet.hoa@free.fr> writes:
popen() est plus facile à utiliser, mais ne te permets pas de faire à la
fois les indirections stdin et stdout. popen() fait une indirection dans
un seul sens.
J'avoue ne jamais avoir essayé d'utiliser popen() comme ça, mais,
d'après le man de cette fonction sur FreeBSD :
The popen() function ``opens'' a process by creating a bidirectional pipe
forking, and invoking the shell.
et, plus loin :
The type argument is a pointer to a null-terminated string which must be
`r' for reading, `w' for writing, or `r+' for reading and writing.
popen() est plus facile à utiliser, mais ne te permets pas de faire à la fois les indirections stdin et stdout. popen() fait une indirection dans un seul sens.
J'avoue ne jamais avoir essayé d'utiliser popen() comme ça, mais, d'après le man de cette fonction sur FreeBSD :
The popen() function ``opens'' a process by creating a bidirectional pipe forking, and invoking the shell.
et, plus loin :
The type argument is a pointer to a null-terminated string which must be `r' for reading, `w' for writing, or `r+' for reading and writing.
-- Éric Jacoboni, né il y a 1377271607 secondes
ts
"J" == Eric Jacoboni writes:
J> J'avoue ne jamais avoir essayé d'utiliser popen() comme ça, mais, J> d'après le man de cette fonction sur FreeBSD :
Solaris aussi a uniquement "r", "w"
J> The type argument is a pointer to a null-terminated string which must be J> `r' for reading, `w' for writing, or `r+' for reading and writing.
/* * Lite2 introduced two-way popen() pipes using _socketpair(). * FreeBSD's pipe() is bidirectional, so we use that. */
--
Guy Decoux
"J" == Eric Jacoboni <jaco@teaser.fr> writes:
J> J'avoue ne jamais avoir essayé d'utiliser popen() comme ça, mais,
J> d'après le man de cette fonction sur FreeBSD :
Solaris aussi a uniquement "r", "w"
J> The type argument is a pointer to a null-terminated string which must be
J> `r' for reading, `w' for writing, or `r+' for reading and writing.
/*
* Lite2 introduced two-way popen() pipes using _socketpair().
* FreeBSD's pipe() is bidirectional, so we use that.
*/
J> J'avoue ne jamais avoir essayé d'utiliser popen() comme ça, mais, J> d'après le man de cette fonction sur FreeBSD :
Solaris aussi a uniquement "r", "w"
J> The type argument is a pointer to a null-terminated string which must be J> `r' for reading, `w' for writing, or `r+' for reading and writing.
/* * Lite2 introduced two-way popen() pipes using _socketpair(). * FreeBSD's pipe() is bidirectional, so we use that. */
--
Guy Decoux
DINH Viêt Hoà
J'avoue ne jamais avoir essayé d'utiliser popen() comme ça, mais, d'après le man de cette fonction sur FreeBSD :
The popen() function ``opens'' a process by creating a bidirectional pipe forking, and invoking the shell.
et, plus loin :
The type argument is a pointer to a null-terminated string which must be `r' for reading, `w' for writing, or `r+' for reading and writing.
mais sur le man posix, j'ai :
$ rman -m posix popen ... The mode argument to popen() is a string that specifies I/O mode:
1. If mode is r, when the child process is started, its file descriptor STDOUT_FILENO shall be the writable end of the pipe, and the file descriptor fileno(stream) in the calling process, where stream is the stream pointer returned by popen(), shall be the readable end of the pipe.
2. If mode is w, when the child process is started its file descriptor STDIN_FILENO shall be the readable end of the pipe, and the file descriptor fileno(stream) in the calling process, where stream is the stream pointer returned by popen(), shall be the writable end of the pipe.
3. If mode is any other value, the result is undefined. ...
J'avoue ne jamais avoir essayé d'utiliser popen() comme ça, mais,
d'après le man de cette fonction sur FreeBSD :
The popen() function ``opens'' a process by creating a bidirectional pipe
forking, and invoking the shell.
et, plus loin :
The type argument is a pointer to a null-terminated string which must be
`r' for reading, `w' for writing, or `r+' for reading and writing.
mais sur le man posix, j'ai :
$ rman -m posix popen
...
The mode argument to popen() is a string that specifies I/O mode:
1. If mode is r, when the child process is started, its file descriptor
STDOUT_FILENO shall be the writable end of the pipe, and the file
descriptor fileno(stream) in the calling process, where stream is the
stream pointer returned by popen(), shall be the readable end of the
pipe.
2. If mode is w, when the child process is started its file descriptor
STDIN_FILENO shall be the readable end of the pipe, and the file
descriptor fileno(stream) in the calling process, where stream is the
stream pointer returned by popen(), shall be the writable end of the
pipe.
3. If mode is any other value, the result is undefined.
...
donc, en gros, "r+" n'est pas portable.
--
DINH V. Hoa,
etPan! - newsreader, mail user agent -- http://libetpan.sf.net/etpan
J'avoue ne jamais avoir essayé d'utiliser popen() comme ça, mais, d'après le man de cette fonction sur FreeBSD :
The popen() function ``opens'' a process by creating a bidirectional pipe forking, and invoking the shell.
et, plus loin :
The type argument is a pointer to a null-terminated string which must be `r' for reading, `w' for writing, or `r+' for reading and writing.
mais sur le man posix, j'ai :
$ rman -m posix popen ... The mode argument to popen() is a string that specifies I/O mode:
1. If mode is r, when the child process is started, its file descriptor STDOUT_FILENO shall be the writable end of the pipe, and the file descriptor fileno(stream) in the calling process, where stream is the stream pointer returned by popen(), shall be the readable end of the pipe.
2. If mode is w, when the child process is started its file descriptor STDIN_FILENO shall be the readable end of the pipe, and the file descriptor fileno(stream) in the calling process, where stream is the stream pointer returned by popen(), shall be the writable end of the pipe.
3. If mode is any other value, the result is undefined. ...