J'ai un petit souci d'analyse des codes d'erreur de l'appel system(3).
Pour simplifier, la partie de mon code intéressante (et incriminée !)
effectue les opérations suivantes :
- Création d'un fichier temporaire avec mkstemp(3) ;
- Ajout de commandes au fichier avec plusieurs write(2) successifs.
Chaque ligne de commande ajoutée au fichier possède la syntaxe
suivante : commande shell || exit 1 ;
- Synchronisation des données du fichier sur disque avec fsync(2) ;
- Fermeture du fichier avec close(2) ;
- Ajout des droits d'exécution au fichier avec un chmod(1) appelé via
system(3) ;
- Execution du fichier avec system(3).
C'est lors de ce dernier appel que j'obtiens les codes d'erreur
suivants :
- Valeur de retour de system(3) : 256 ;
- Errno : 2 (No such file or directory) ;
- WEXITSTATUS(256) : 1.
Mes questions sont les suivantes :
- Comment interpréter ces codes d'erreur ?
- A quoi correspond le '1' du WEXITSTATUS() ? Est-ce un '1' renvoyé
par le fichier temporaire sur échec d'exécution d'une commande shell
?
- L'erreur 2 d'errno signifie-t-elle que mon fichier temporaire
n'existe finalement pas du tout ?
Pour information, le code a été compilé avec gcc sans aucune
optimisation, et tourne sur une RedHat Entreprise 3.0 Update 6 (Noyau
2.4.21-37).
Merci pour vos éclaircissements, et pardonnez-moi si je n'ai pas
posté sur le bon groupe !
J'ai un petit souci d'analyse des codes d'erreur de l'appel system(3).
Pour simplifier, la partie de mon code intéressante (et incriminée !)
effectue les opérations suivantes :
- Création d'un fichier temporaire avec mkstemp(3) ;
- Ajout de commandes au fichier avec plusieurs write(2) successifs.
Chaque ligne de commande ajoutée au fichier possède la syntaxe
suivante : commande shell || exit 1 ;
- Synchronisation des données du fichier sur disque avec fsync(2) ;
- Fermeture du fichier avec close(2) ;
- Ajout des droits d'exécution au fichier avec un chmod(1) appelé via
system(3) ;
- Execution du fichier avec system(3).
C'est lors de ce dernier appel que j'obtiens les codes d'erreur
suivants :
- Valeur de retour de system(3) : 256 ;
- Errno : 2 (No such file or directory) ;
- WEXITSTATUS(256) : 1.
Mes questions sont les suivantes :
- Comment interpréter ces codes d'erreur ?
- A quoi correspond le '1' du WEXITSTATUS() ? Est-ce un '1' renvoyé
par le fichier temporaire sur échec d'exécution d'une commande shell
?
- L'erreur 2 d'errno signifie-t-elle que mon fichier temporaire
n'existe finalement pas du tout ?
Pour information, le code a été compilé avec gcc sans aucune
optimisation, et tourne sur une RedHat Entreprise 3.0 Update 6 (Noyau
2.4.21-37).
Merci pour vos éclaircissements, et pardonnez-moi si je n'ai pas
posté sur le bon groupe !
J'ai un petit souci d'analyse des codes d'erreur de l'appel system(3).
Pour simplifier, la partie de mon code intéressante (et incriminée !)
effectue les opérations suivantes :
- Création d'un fichier temporaire avec mkstemp(3) ;
- Ajout de commandes au fichier avec plusieurs write(2) successifs.
Chaque ligne de commande ajoutée au fichier possède la syntaxe
suivante : commande shell || exit 1 ;
- Synchronisation des données du fichier sur disque avec fsync(2) ;
- Fermeture du fichier avec close(2) ;
- Ajout des droits d'exécution au fichier avec un chmod(1) appelé via
system(3) ;
- Execution du fichier avec system(3).
C'est lors de ce dernier appel que j'obtiens les codes d'erreur
suivants :
- Valeur de retour de system(3) : 256 ;
- Errno : 2 (No such file or directory) ;
- WEXITSTATUS(256) : 1.
Mes questions sont les suivantes :
- Comment interpréter ces codes d'erreur ?
- A quoi correspond le '1' du WEXITSTATUS() ? Est-ce un '1' renvoyé
par le fichier temporaire sur échec d'exécution d'une commande shell
?
- L'erreur 2 d'errno signifie-t-elle que mon fichier temporaire
n'existe finalement pas du tout ?
Pour information, le code a été compilé avec gcc sans aucune
optimisation, et tourne sur une RedHat Entreprise 3.0 Update 6 (Noyau
2.4.21-37).
Merci pour vos éclaircissements, et pardonnez-moi si je n'ai pas
posté sur le bon groupe !
Premièrement tout ce qui suit n'est pas du C standard et devrait être posté
sur un NG dédié à ta plateforme.
J'ai un petit souci d'analyse des codes d'erreur de l'appel system(3).
Pour simplifier, la partie de mon code intéressante (et incriminée !)
effectue les opérations suivantes :
Si on tient à gérer finement le code de retour de system, alors on n' utilise
pas system mais fork/exec.- Création d'un fichier temporaire avec mkstemp(3) ;
- Ajout de commandes au fichier avec plusieurs write(2) successifs.
Vu que tu écris du texte par ligne, le mieux aurait dû être d'utili se
fopen/fprintf/fclose...Chaque ligne de commande ajoutée au fichier possède la syntaxe
suivante : commande shell || exit 1 ;
Bizarre comme commande : si ton shell part en erreur (ne retourne pas 0),
alors tu forces le code non nul à 1. Tu perds donc le véritable code de
retour du programme. Le "|| exit 1" est inutile (sans parler du ";").
- Synchronisation des données du fichier sur disque avec fsync(2) ;
Quelle drôle d'idée de forcer l'écriture sur disque d'un fichier te mporaire.
C'est généralement une mauvaise idée.
- Fermeture du fichier avec close(2) ;
- Ajout des droits d'exécution au fichier avec un chmod(1) appelé v ia
system(3) ;
Cela aurait dû être fait par la fonction fchmod, surtout pas par l'ex écution
d'un shell externe via la commande system.
- Execution du fichier avec system(3).
C'est lors de ce dernier appel que j'obtiens les codes d'erreur
suivants :
- Valeur de retour de system(3) : 256 ;
- Errno : 2 (No such file or directory) ;
- WEXITSTATUS(256) : 1.
Mes questions sont les suivantes :
- Comment interpréter ces codes d'erreur ?
La fonction system lance un shell et ce shell exécute la commande. Le c ode
de retour est celui du shell.- A quoi correspond le '1' du WEXITSTATUS() ? Est-ce un '1' renvoyé
par le fichier temporaire sur échec d'exécution d'une commande shell
?
Comme tu ne dis pas exactement quelle commande tu as lancé, on ne peut
savoir.- L'erreur 2 d'errno signifie-t-elle que mon fichier temporaire
n'existe finalement pas du tout ?
errno n'a pas à être testé après system, seul le code de retour d oit l'être.
Voir le man.Pour information, le code a été compilé avec gcc sans aucune
optimisation, et tourne sur une RedHat Entreprise 3.0 Update 6 (Noyau
2.4.21-37).
Si tu disais ce que tu exécutes dans ton shell, peut-être on pourrait savoir
ce qui ne vas pas. Le cas le plus typique est l'oublie d'un "./" avant un
shell-script vu que le PATH n'est pas toujours celui que l'on croit.
Teste ton shell-script directement sous shell en utilisant exactement les
mêmes variables d'environnement que celles qui sont utilisées _dans_ ton
programme C.Merci pour vos éclaircissements, et pardonnez-moi si je n'ai pas
posté sur le bon groupe !
Poste la prochaine fois dans un NG lié à Linux ou unix.
--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Premièrement tout ce qui suit n'est pas du C standard et devrait être posté
sur un NG dédié à ta plateforme.
J'ai un petit souci d'analyse des codes d'erreur de l'appel system(3).
Pour simplifier, la partie de mon code intéressante (et incriminée !)
effectue les opérations suivantes :
Si on tient à gérer finement le code de retour de system, alors on n' utilise
pas system mais fork/exec.
- Création d'un fichier temporaire avec mkstemp(3) ;
- Ajout de commandes au fichier avec plusieurs write(2) successifs.
Vu que tu écris du texte par ligne, le mieux aurait dû être d'utili se
fopen/fprintf/fclose...
Chaque ligne de commande ajoutée au fichier possède la syntaxe
suivante : commande shell || exit 1 ;
Bizarre comme commande : si ton shell part en erreur (ne retourne pas 0),
alors tu forces le code non nul à 1. Tu perds donc le véritable code de
retour du programme. Le "|| exit 1" est inutile (sans parler du ";").
- Synchronisation des données du fichier sur disque avec fsync(2) ;
Quelle drôle d'idée de forcer l'écriture sur disque d'un fichier te mporaire.
C'est généralement une mauvaise idée.
- Fermeture du fichier avec close(2) ;
- Ajout des droits d'exécution au fichier avec un chmod(1) appelé v ia
system(3) ;
Cela aurait dû être fait par la fonction fchmod, surtout pas par l'ex écution
d'un shell externe via la commande system.
- Execution du fichier avec system(3).
C'est lors de ce dernier appel que j'obtiens les codes d'erreur
suivants :
- Valeur de retour de system(3) : 256 ;
- Errno : 2 (No such file or directory) ;
- WEXITSTATUS(256) : 1.
Mes questions sont les suivantes :
- Comment interpréter ces codes d'erreur ?
La fonction system lance un shell et ce shell exécute la commande. Le c ode
de retour est celui du shell.
- A quoi correspond le '1' du WEXITSTATUS() ? Est-ce un '1' renvoyé
par le fichier temporaire sur échec d'exécution d'une commande shell
?
Comme tu ne dis pas exactement quelle commande tu as lancé, on ne peut
savoir.
- L'erreur 2 d'errno signifie-t-elle que mon fichier temporaire
n'existe finalement pas du tout ?
errno n'a pas à être testé après system, seul le code de retour d oit l'être.
Voir le man.
Pour information, le code a été compilé avec gcc sans aucune
optimisation, et tourne sur une RedHat Entreprise 3.0 Update 6 (Noyau
2.4.21-37).
Si tu disais ce que tu exécutes dans ton shell, peut-être on pourrait savoir
ce qui ne vas pas. Le cas le plus typique est l'oublie d'un "./" avant un
shell-script vu que le PATH n'est pas toujours celui que l'on croit.
Teste ton shell-script directement sous shell en utilisant exactement les
mêmes variables d'environnement que celles qui sont utilisées _dans_ ton
programme C.
Merci pour vos éclaircissements, et pardonnez-moi si je n'ai pas
posté sur le bon groupe !
Poste la prochaine fois dans un NG lié à Linux ou unix.
--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Premièrement tout ce qui suit n'est pas du C standard et devrait être posté
sur un NG dédié à ta plateforme.
J'ai un petit souci d'analyse des codes d'erreur de l'appel system(3).
Pour simplifier, la partie de mon code intéressante (et incriminée !)
effectue les opérations suivantes :
Si on tient à gérer finement le code de retour de system, alors on n' utilise
pas system mais fork/exec.- Création d'un fichier temporaire avec mkstemp(3) ;
- Ajout de commandes au fichier avec plusieurs write(2) successifs.
Vu que tu écris du texte par ligne, le mieux aurait dû être d'utili se
fopen/fprintf/fclose...Chaque ligne de commande ajoutée au fichier possède la syntaxe
suivante : commande shell || exit 1 ;
Bizarre comme commande : si ton shell part en erreur (ne retourne pas 0),
alors tu forces le code non nul à 1. Tu perds donc le véritable code de
retour du programme. Le "|| exit 1" est inutile (sans parler du ";").
- Synchronisation des données du fichier sur disque avec fsync(2) ;
Quelle drôle d'idée de forcer l'écriture sur disque d'un fichier te mporaire.
C'est généralement une mauvaise idée.
- Fermeture du fichier avec close(2) ;
- Ajout des droits d'exécution au fichier avec un chmod(1) appelé v ia
system(3) ;
Cela aurait dû être fait par la fonction fchmod, surtout pas par l'ex écution
d'un shell externe via la commande system.
- Execution du fichier avec system(3).
C'est lors de ce dernier appel que j'obtiens les codes d'erreur
suivants :
- Valeur de retour de system(3) : 256 ;
- Errno : 2 (No such file or directory) ;
- WEXITSTATUS(256) : 1.
Mes questions sont les suivantes :
- Comment interpréter ces codes d'erreur ?
La fonction system lance un shell et ce shell exécute la commande. Le c ode
de retour est celui du shell.- A quoi correspond le '1' du WEXITSTATUS() ? Est-ce un '1' renvoyé
par le fichier temporaire sur échec d'exécution d'une commande shell
?
Comme tu ne dis pas exactement quelle commande tu as lancé, on ne peut
savoir.- L'erreur 2 d'errno signifie-t-elle que mon fichier temporaire
n'existe finalement pas du tout ?
errno n'a pas à être testé après system, seul le code de retour d oit l'être.
Voir le man.Pour information, le code a été compilé avec gcc sans aucune
optimisation, et tourne sur une RedHat Entreprise 3.0 Update 6 (Noyau
2.4.21-37).
Si tu disais ce que tu exécutes dans ton shell, peut-être on pourrait savoir
ce qui ne vas pas. Le cas le plus typique est l'oublie d'un "./" avant un
shell-script vu que le PATH n'est pas toujours celui que l'on croit.
Teste ton shell-script directement sous shell en utilisant exactement les
mêmes variables d'environnement que celles qui sont utilisées _dans_ ton
programme C.Merci pour vos éclaircissements, et pardonnez-moi si je n'ai pas
posté sur le bon groupe !
Poste la prochaine fois dans un NG lié à Linux ou unix.
--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Si tu disais ce que tu exécutes dans ton shell, peut-être on pourrait savoir
ce qui ne vas pas. Le cas le plus typique est l'oublie d'un "./" avant un
shell-script vu que le PATH n'est pas toujours celui que l'on croit.
Tout d'abord, toute commande du fichier est exécutée en précisant un
chemin absolu, ainsi que le script lui même. Ensuite (mais là, je
sors totalement du cadre de ce groupe),
le script sort en erreur sur
exécution d'une commande de configuration d'un lien série avec stty.
Si cette commande est exécutée à la main, ou en lançant le script
complet, tout est OK.
Le plus incompréhensible, c'est que cette erreur
est aléatoire. Si je relance mon programme, ça peut tomber en marche.
Si je remplace le binaire stty par un script portant le même nom
(coquille vide), ça marche également. Si tu as une idée là-dessus
et souhaites plus d'informations à ce sujet, nous pouvons volontiers
poursuivre sur un autre groupe (fr.comp.os.???).
Si tu disais ce que tu exécutes dans ton shell, peut-être on pourrait savoir
ce qui ne vas pas. Le cas le plus typique est l'oublie d'un "./" avant un
shell-script vu que le PATH n'est pas toujours celui que l'on croit.
Tout d'abord, toute commande du fichier est exécutée en précisant un
chemin absolu, ainsi que le script lui même. Ensuite (mais là, je
sors totalement du cadre de ce groupe),
le script sort en erreur sur
exécution d'une commande de configuration d'un lien série avec stty.
Si cette commande est exécutée à la main, ou en lançant le script
complet, tout est OK.
Le plus incompréhensible, c'est que cette erreur
est aléatoire. Si je relance mon programme, ça peut tomber en marche.
Si je remplace le binaire stty par un script portant le même nom
(coquille vide), ça marche également. Si tu as une idée là-dessus
et souhaites plus d'informations à ce sujet, nous pouvons volontiers
poursuivre sur un autre groupe (fr.comp.os.???).
Si tu disais ce que tu exécutes dans ton shell, peut-être on pourrait savoir
ce qui ne vas pas. Le cas le plus typique est l'oublie d'un "./" avant un
shell-script vu que le PATH n'est pas toujours celui que l'on croit.
Tout d'abord, toute commande du fichier est exécutée en précisant un
chemin absolu, ainsi que le script lui même. Ensuite (mais là, je
sors totalement du cadre de ce groupe),
le script sort en erreur sur
exécution d'une commande de configuration d'un lien série avec stty.
Si cette commande est exécutée à la main, ou en lançant le script
complet, tout est OK.
Le plus incompréhensible, c'est que cette erreur
est aléatoire. Si je relance mon programme, ça peut tomber en marche.
Si je remplace le binaire stty par un script portant le même nom
(coquille vide), ça marche également. Si tu as une idée là-dessus
et souhaites plus d'informations à ce sujet, nous pouvons volontiers
poursuivre sur un autre groupe (fr.comp.os.???).