Bonjour,
J'utilise popen pour exécuter une commande ksh dont je redirige le stderr:
2> /dev/null.
Si le résultat de la commande est bon, aucun message n'est affiché sur
stdout car il est récupéré via le descripteur dans une chaîne de caractères
C et c'est ce que je veux.
Si le résultat n'est pas bon, le message d'erreur de la commande s'affiche
systématiquement malgré la redirection.
De plus, ni le message provenant du perror ni celui du printf (exécutés en
cas de résultat ko) ne sont affichés que ce soit sur le stderr ou le stdout
(pourtant j'ai bien fermé le descripteur du popen avant). Je voudrais
l'inverse ! C.à.d que les messages C soient affichés, mais pas ceux du ksh.
Le premier problème se résout en fermant le stderr mais je voudrais éviter
cela. Peut-on malgré tout imaginer une fermeture temporaire de stderr dont
aura préalablement dup2-liqué le descripteur pour le réouvrir après, mais je
n'ai pas eu le temps de faire la manip ? Existe-t'il une autre solution (je
préfèrerais) ?
Pour le second, je n'ai pas trouvé.
Merci pour toute aide.
Bonjour,
J'utilise popen pour exécuter une commande ksh dont je redirige le stderr:
2> /dev/null.
Si le résultat de la commande est bon, aucun message n'est affiché sur
stdout car il est récupéré via le descripteur dans une chaîne de caractères
C et c'est ce que je veux.
Si le résultat n'est pas bon, le message d'erreur de la commande s'affiche
systématiquement malgré la redirection.
De plus, ni le message provenant du perror ni celui du printf (exécutés en
cas de résultat ko) ne sont affichés que ce soit sur le stderr ou le stdout
(pourtant j'ai bien fermé le descripteur du popen avant). Je voudrais
l'inverse ! C.à.d que les messages C soient affichés, mais pas ceux du ksh.
Le premier problème se résout en fermant le stderr mais je voudrais éviter
cela. Peut-on malgré tout imaginer une fermeture temporaire de stderr dont
aura préalablement dup2-liqué le descripteur pour le réouvrir après, mais je
n'ai pas eu le temps de faire la manip ? Existe-t'il une autre solution (je
préfèrerais) ?
Pour le second, je n'ai pas trouvé.
Merci pour toute aide.
Bonjour,
J'utilise popen pour exécuter une commande ksh dont je redirige le stderr:
2> /dev/null.
Si le résultat de la commande est bon, aucun message n'est affiché sur
stdout car il est récupéré via le descripteur dans une chaîne de caractères
C et c'est ce que je veux.
Si le résultat n'est pas bon, le message d'erreur de la commande s'affiche
systématiquement malgré la redirection.
De plus, ni le message provenant du perror ni celui du printf (exécutés en
cas de résultat ko) ne sont affichés que ce soit sur le stderr ou le stdout
(pourtant j'ai bien fermé le descripteur du popen avant). Je voudrais
l'inverse ! C.à.d que les messages C soient affichés, mais pas ceux du ksh.
Le premier problème se résout en fermant le stderr mais je voudrais éviter
cela. Peut-on malgré tout imaginer une fermeture temporaire de stderr dont
aura préalablement dup2-liqué le descripteur pour le réouvrir après, mais je
n'ai pas eu le temps de faire la manip ? Existe-t'il une autre solution (je
préfèrerais) ?
Pour le second, je n'ai pas trouvé.
Merci pour toute aide.
Bonjour,
J'utilise popen pour exécuter une commande ksh dont je redirige le stderr:
2> /dev/null.
Si le résultat de la commande est bon, aucun message n'est affiché sur
stdout car il est récupéré via le descripteur dans une chaîne de caractères
C et c'est ce que je veux.
Si le résultat n'est pas bon, le message d'erreur de la commande s'affiche
systématiquement malgré la redirection.
De plus, ni le message provenant du perror ni celui du printf (exécutés en
cas de résultat ko) ne sont affichés que ce soit sur le stderr ou le stdout
(pourtant j'ai bien fermé le descripteur du popen avant). Je voudrais
l'inverse ! C.à.d que les messages C soient affichés, mais pas ceux du ksh.
Le premier problème se résout en fermant le stderr mais je voudrais éviter
cela. Peut-on malgré tout imaginer une fermeture temporaire de stderr dont
aura préalablement dup2-liqué le descripteur pour le réouvrir après, mais
je
n'ai pas eu le temps de faire la manip ? Existe-t'il une autre solution (je
préfèrerais) ?
Pour le second, je n'ai pas trouvé.
Merci pour toute aide.
A ce niveau de detail, en general, vaut mieux descendre d'un niveau et
tout faire directement a coups d'appel posix.
Sauf si ca doit imperativement tourner sur un systeme sans fork, vaut
mieux aller bosser directement avec pipe/fork/fdopen/exec/wait...
Bonjour,
J'utilise popen pour exécuter une commande ksh dont je redirige le stderr:
2> /dev/null.
Si le résultat de la commande est bon, aucun message n'est affiché sur
stdout car il est récupéré via le descripteur dans une chaîne de caractères
C et c'est ce que je veux.
Si le résultat n'est pas bon, le message d'erreur de la commande s'affiche
systématiquement malgré la redirection.
De plus, ni le message provenant du perror ni celui du printf (exécutés en
cas de résultat ko) ne sont affichés que ce soit sur le stderr ou le stdout
(pourtant j'ai bien fermé le descripteur du popen avant). Je voudrais
l'inverse ! C.à.d que les messages C soient affichés, mais pas ceux du ksh.
Le premier problème se résout en fermant le stderr mais je voudrais éviter
cela. Peut-on malgré tout imaginer une fermeture temporaire de stderr dont
aura préalablement dup2-liqué le descripteur pour le réouvrir après, mais
je
n'ai pas eu le temps de faire la manip ? Existe-t'il une autre solution (je
préfèrerais) ?
Pour le second, je n'ai pas trouvé.
Merci pour toute aide.
A ce niveau de detail, en general, vaut mieux descendre d'un niveau et
tout faire directement a coups d'appel posix.
Sauf si ca doit imperativement tourner sur un systeme sans fork, vaut
mieux aller bosser directement avec pipe/fork/fdopen/exec/wait...
Bonjour,
J'utilise popen pour exécuter une commande ksh dont je redirige le stderr:
2> /dev/null.
Si le résultat de la commande est bon, aucun message n'est affiché sur
stdout car il est récupéré via le descripteur dans une chaîne de caractères
C et c'est ce que je veux.
Si le résultat n'est pas bon, le message d'erreur de la commande s'affiche
systématiquement malgré la redirection.
De plus, ni le message provenant du perror ni celui du printf (exécutés en
cas de résultat ko) ne sont affichés que ce soit sur le stderr ou le stdout
(pourtant j'ai bien fermé le descripteur du popen avant). Je voudrais
l'inverse ! C.à.d que les messages C soient affichés, mais pas ceux du ksh.
Le premier problème se résout en fermant le stderr mais je voudrais éviter
cela. Peut-on malgré tout imaginer une fermeture temporaire de stderr dont
aura préalablement dup2-liqué le descripteur pour le réouvrir après, mais
je
n'ai pas eu le temps de faire la manip ? Existe-t'il une autre solution (je
préfèrerais) ?
Pour le second, je n'ai pas trouvé.
Merci pour toute aide.
A ce niveau de detail, en general, vaut mieux descendre d'un niveau et
tout faire directement a coups d'appel posix.
Sauf si ca doit imperativement tourner sur un systeme sans fork, vaut
mieux aller bosser directement avec pipe/fork/fdopen/exec/wait...
A ce niveau de detail, en general, vaut mieux descendre d'un niveau et
tout faire directement a coups d'appel posix.
Bah oui, mais malgré que je l'aie fait pour le boulot je pose la question
pour l'amour de l'art car le cas qui me pose problème ne se produira pas.Sauf si ca doit imperativement tourner sur un systeme sans fork, vaut
mieux aller bosser directement avec pipe/fork/fdopen/exec/wait...
Exemple ?... Toujours pour l'amour de l'art :-P
A ce niveau de detail, en general, vaut mieux descendre d'un niveau et
tout faire directement a coups d'appel posix.
Bah oui, mais malgré que je l'aie fait pour le boulot je pose la question
pour l'amour de l'art car le cas qui me pose problème ne se produira pas.
Sauf si ca doit imperativement tourner sur un systeme sans fork, vaut
mieux aller bosser directement avec pipe/fork/fdopen/exec/wait...
Exemple ?... Toujours pour l'amour de l'art :-P
A ce niveau de detail, en general, vaut mieux descendre d'un niveau et
tout faire directement a coups d'appel posix.
Bah oui, mais malgré que je l'aie fait pour le boulot je pose la question
pour l'amour de l'art car le cas qui me pose problème ne se produira pas.Sauf si ca doit imperativement tourner sur un systeme sans fork, vaut
mieux aller bosser directement avec pipe/fork/fdopen/exec/wait...
Exemple ?... Toujours pour l'amour de l'art :-P
A ce niveau de detail, en general, vaut mieux descendre d'un niveau et
tout faire directement a coups d'appel posix.
Bah oui, mais malgré que je l'aie fait pour le boulot je pose la question
pour l'amour de l'art car le cas qui me pose problème ne se produira pas.Sauf si ca doit imperativement tourner sur un systeme sans fork, vaut
mieux aller bosser directement avec pipe/fork/fdopen/exec/wait...
Exemple ?... Toujours pour l'amour de l'art :-P
Tu ne cites pas d'exemple non plus... ton probleme est relativement
flou et peu explique
A ce niveau de detail, en general, vaut mieux descendre d'un niveau et
tout faire directement a coups d'appel posix.
Bah oui, mais malgré que je l'aie fait pour le boulot je pose la question
pour l'amour de l'art car le cas qui me pose problème ne se produira pas.
Sauf si ca doit imperativement tourner sur un systeme sans fork, vaut
mieux aller bosser directement avec pipe/fork/fdopen/exec/wait...
Exemple ?... Toujours pour l'amour de l'art :-P
Tu ne cites pas d'exemple non plus... ton probleme est relativement
flou et peu explique
A ce niveau de detail, en general, vaut mieux descendre d'un niveau et
tout faire directement a coups d'appel posix.
Bah oui, mais malgré que je l'aie fait pour le boulot je pose la question
pour l'amour de l'art car le cas qui me pose problème ne se produira pas.Sauf si ca doit imperativement tourner sur un systeme sans fork, vaut
mieux aller bosser directement avec pipe/fork/fdopen/exec/wait...
Exemple ?... Toujours pour l'amour de l'art :-P
Tu ne cites pas d'exemple non plus... ton probleme est relativement
flou et peu explique
if ((pp = popen("ls toto* | head -1 2> /dev/null","r") != NULL)
/* Affichage NON DESIRE sur stderr du résultat de la commande shell :
"toto* not found" */
if ((pp = popen("ls toto* | head -1 2> /dev/null","r") != NULL)
/* Affichage NON DESIRE sur stderr du résultat de la commande shell :
"toto* not found" */
if ((pp = popen("ls toto* | head -1 2> /dev/null","r") != NULL)
/* Affichage NON DESIRE sur stderr du résultat de la commande shell :
"toto* not found" */
if ((pp = popen("ls toto* | head -1 2> /dev/null","r") != NULL)
{
while (fgets(buf, sizeof(buf), pp)) strcpy(resultat,buf); /* La récupération
se passe ok */
pclose(pp);
}
else
{
/* Affichage NON DESIRE sur stderr du résultat de la commande shell : "toto*
not found" */
perror ("Pas de résultat"); /* Ce message ne s'affiche jamais en cas d'échec
de la commande */
fprintf(stdout,"Pas de résultat"); /* Celui-là non plus */
}
Ma question subsidiaire était de savoir si stderr pouvait être fermé le
temps d'exécuter le popen puis réouvert de suite après, mais ce n'est pas ce
qui m'importe le plus car je préfèrerais une autre solution si elle existe.
if ((pp = popen("ls toto* | head -1 2> /dev/null","r") != NULL)
{
while (fgets(buf, sizeof(buf), pp)) strcpy(resultat,buf); /* La récupération
se passe ok */
pclose(pp);
}
else
{
/* Affichage NON DESIRE sur stderr du résultat de la commande shell : "toto*
not found" */
perror ("Pas de résultat"); /* Ce message ne s'affiche jamais en cas d'échec
de la commande */
fprintf(stdout,"Pas de résultat"); /* Celui-là non plus */
}
Ma question subsidiaire était de savoir si stderr pouvait être fermé le
temps d'exécuter le popen puis réouvert de suite après, mais ce n'est pas ce
qui m'importe le plus car je préfèrerais une autre solution si elle existe.
if ((pp = popen("ls toto* | head -1 2> /dev/null","r") != NULL)
{
while (fgets(buf, sizeof(buf), pp)) strcpy(resultat,buf); /* La récupération
se passe ok */
pclose(pp);
}
else
{
/* Affichage NON DESIRE sur stderr du résultat de la commande shell : "toto*
not found" */
perror ("Pas de résultat"); /* Ce message ne s'affiche jamais en cas d'échec
de la commande */
fprintf(stdout,"Pas de résultat"); /* Celui-là non plus */
}
Ma question subsidiaire était de savoir si stderr pouvait être fermé le
temps d'exécuter le popen puis réouvert de suite après, mais ce n'est pas ce
qui m'importe le plus car je préfèrerais une autre solution si elle existe.
(glob(3) par exemple).
(glob(3) par exemple).
(glob(3) par exemple).
ou pour tout le pipe;
{ ls toto*|head -1; } 2>/dev/null
ou pour tout le pipe;
{ ls toto*|head -1; } 2>/dev/null
ou pour tout le pipe;
{ ls toto*|head -1; } 2>/dev/null
Heu.. ben comme ca, je ne suis pas super en forme je dirais que c'est
logique. Tu as redirigé le stderr de la partie "head". Celle du ls
est toujours assignée au terminal, et le "ls" est libre de te dire
qu'il n'a rien trouvé pour "toto" et ca arrive à l'écran.
Le "head -1" te sert à récupérer la 1ere ligne je pense. Pourquoi tu
ne gère pas cela dans la boucle lisant le flux issu du "ls toto*" ?
Heu.. ben comme ca, je ne suis pas super en forme je dirais que c'est
logique. Tu as redirigé le stderr de la partie "head". Celle du ls
est toujours assignée au terminal, et le "ls" est libre de te dire
qu'il n'a rien trouvé pour "toto" et ca arrive à l'écran.
Le "head -1" te sert à récupérer la 1ere ligne je pense. Pourquoi tu
ne gère pas cela dans la boucle lisant le flux issu du "ls toto*" ?
Heu.. ben comme ca, je ne suis pas super en forme je dirais que c'est
logique. Tu as redirigé le stderr de la partie "head". Celle du ls
est toujours assignée au terminal, et le "ls" est libre de te dire
qu'il n'a rien trouvé pour "toto" et ca arrive à l'écran.
Le "head -1" te sert à récupérer la 1ere ligne je pense. Pourquoi tu
ne gère pas cela dans la boucle lisant le flux issu du "ls toto*" ?
SANS GESTION D'ERREUR:
int fd[2];
pipe(fd);
int pid = fork();
if (pid == 0) { /* fils */
close(2);
if (fd[1] != 1) {
dup2(fd[1], 1);
close(fd[1]);
close(fd[0]);
execl("/bin/sh", "sh", "-c", "ls toto*|head -1", NULL);
} else { /* papa */
close(fd[1]);
FILE *f = fdopen(fd[0], "r");
fgets sur f....
fclose(f);
int status;
waitpid(pid, &status, 0);
}
Bon, apres, en vrai, bien sur, on va faire ca sur du vrai code qui a besoin
de shell, parce que la, ca se fait tout en C, bien sur...
(glob(3) par exemple).
SANS GESTION D'ERREUR:
int fd[2];
pipe(fd);
int pid = fork();
if (pid == 0) { /* fils */
close(2);
if (fd[1] != 1) {
dup2(fd[1], 1);
close(fd[1]);
close(fd[0]);
execl("/bin/sh", "sh", "-c", "ls toto*|head -1", NULL);
} else { /* papa */
close(fd[1]);
FILE *f = fdopen(fd[0], "r");
fgets sur f....
fclose(f);
int status;
waitpid(pid, &status, 0);
}
Bon, apres, en vrai, bien sur, on va faire ca sur du vrai code qui a besoin
de shell, parce que la, ca se fait tout en C, bien sur...
(glob(3) par exemple).
SANS GESTION D'ERREUR:
int fd[2];
pipe(fd);
int pid = fork();
if (pid == 0) { /* fils */
close(2);
if (fd[1] != 1) {
dup2(fd[1], 1);
close(fd[1]);
close(fd[0]);
execl("/bin/sh", "sh", "-c", "ls toto*|head -1", NULL);
} else { /* papa */
close(fd[1]);
FILE *f = fdopen(fd[0], "r");
fgets sur f....
fclose(f);
int status;
waitpid(pid, &status, 0);
}
Bon, apres, en vrai, bien sur, on va faire ca sur du vrai code qui a besoin
de shell, parce que la, ca se fait tout en C, bien sur...
(glob(3) par exemple).