Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

(pipe & fork) | popen

7 réponses
Avatar
amaguk
Bonjour,

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.

Merci d'avance,

amaguk

7 réponses

Avatar
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à.


--
DINH V. Hoa,

etPan! - newsreader, mail user agent -- http://libetpan.sf.net/etpan

Avatar
amaguk
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.

Avatar
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.


voilà.

--
DINH V. Hoa,

etPan! - newsreader, mail user agent -- http://libetpan.sf.net/etpan


Avatar
amaguk
DINH Viêt Hoà wrote:
voilà.



Un grand merci ! Je vais maintenant essayer de voir comment gérer tout
cela ;-))

amaguk

Avatar
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

Avatar
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





Avatar
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.
...

donc, en gros, "r+" n'est pas portable.

--
DINH V. Hoa,

etPan! - newsreader, mail user agent -- http://libetpan.sf.net/etpan