: Problème avec la fonction system [C] - C - Programmation
Marsh Posté le 09-08-2011 à 17:40:38
mauvaise idée.
Pour ce genre de chose, tu dois pouvoir interroger directement ton système pour savoir si le fichier existe. Tu peux toujours choisir de comprendre d'où vient ce problème, mais clairement, tu ne t'orientes pas vers la bonne solution.
Marsh Posté le 09-08-2011 à 18:10:05
Par exemple avec la fonction stat() et la vérification de errno si le code retour est différent de zéro.
Marsh Posté le 10-08-2011 à 10:18:28
Je suis assez d'accord avec toi mais en fait je ne suis pas le développeur de ces programmes, je m'occupe juste de la migration.
L'idée étant de migrer sans modification du code source
theshockwave a écrit : mauvaise idée. |
Marsh Posté le 10-08-2011 à 12:37:17
J'ai essayé la fonction stat(), ça marche nickel je n'ai pas d'erreur.
Par contre le mystère reste entier sur cette fonction system(), c'est dommage.
Sinon quelqu'un serait dans quel cas il est préférable d'utiliser la fonction system() ?
Elmoricq a écrit : Par exemple avec la fonction stat() et la vérification de errno si le code retour est différent de zéro. |
Marsh Posté le 10-08-2011 à 12:40:00
Les appels system étaient déjà implémentés dans le source.
J'ai juste compiler le source sous une machine linux et à l'execution le retour -1 de la fonction system me le fait planter
theshockwave a écrit : parce que tu arrives à faire des appels à system sans modifier le source ? |
Marsh Posté le 10-08-2011 à 13:38:30
sal1 a écrit : J'ai essayé la fonction stat(), ça marche nickel je n'ai pas d'erreur. |
Nickel.
sal1 a écrit : Par contre le mystère reste entier sur cette fonction system(), c'est dommage. |
Il pourrait être intéressant, ne serait-ce par curiosité, de comprendre ce qui se passe.
Que contient errno ?
sal1 a écrit : Sinon quelqu'un serait dans quel cas il est préférable d'utiliser la fonction system() ? |
C'est assez rare que l'on ait à l'utiliser. Le cas le plus courant que je vois serait pour appeler un programme qui fait des choses bien plus compliquées qu'un ls en tout cas.
Marsh Posté le 10-08-2011 à 13:59:55
Je ne sais pas utiliser errno, comment faire ?
Edit : Autant pour moi Google est mon ami. Le message d'erreur avec errno est "No child processes", une histoire de processus fils apparament. Mais ça je ne sais pas comment corriger ça
Elmoricq a écrit : Il pourrait être intéressant, ne serait-ce par curiosité, de comprendre ce qui se passe. |
Marsh Posté le 10-08-2011 à 16:18:36
Pour de la documentation, tu peux aussi taper :
man <fonction C>
RETURN VALUES |
Après, pourquoi ça échoue après un bête fork dans ton gros programme alors que ça marche dans ton petit code qui tente de reproduire le problème ?
Souci mémoire sur le nouveau serveur ?
Marsh Posté le 10-08-2011 à 16:38:53
fork et exec ne foirent normalement pas avec ECHILD, en fait, je ne vois que wait qui le peut. Bizarre. Ça sent le problème dont la source est ailleurs,
Marsh Posté le 10-08-2011 à 16:57:07
ReplyMarsh Posté le 10-08-2011 à 16:57:38
Dans le code de la fonction system il y a un waitpid, c'est peut être lui le coupable ?
Un Programmeur a écrit : fork et exec ne foirent normalement pas avec ECHILD, en fait, je ne vois que wait qui le peut. Bizarre. Ça sent le problème dont la source est ailleurs, |
Marsh Posté le 10-08-2011 à 17:01:10
ReplyMarsh Posté le 10-08-2011 à 17:08:27
J'ai bien vu ce qu'était ulimit mais je ne vois pas comment l'utiliser ici !!
Elmoricq a écrit : |
Marsh Posté le 10-08-2011 à 17:44:37
sal1 a écrit : Dans le code de la fonction system il y a un waitpid, c'est peut être lui le coupable ? |
Je sais, j'ai simplement du mal a imaginer les circonstances qui font qu'il peut foirer avec cette erreur. Je crains de ne voir que l'approche dichotomique pour trouver le pb.
Marsh Posté le 11-08-2011 à 11:33:11
Un Programmeur a écrit : |
Je me suis amusé à faire des tests complémentaires, j'ai repris le code de la fonction system() en le mettant dans une fonction "maison" appelée par mon programme. Je découvre que le problème vient bien du waitpid.
Après une recherche : je trouve dans le man de waitpid : "
Citation : Les spécifications Single Unix décrivent un attribut SA_NOCLDWAIT (absent sous Linux) permettant (lorsqu'il est positionné) aux processus fils se terminant de ne pas devenir zombies, comme quand l'action pour SIGCHLD est fixée à SIG_IGN (ce qui toutefois n'est pas autorisé par POSIX). Un appel à wait() ou waitpid() bloquera jusqu'à ce qu'un fils se termine, puis échouera avec errno contenant ECHILD. |
"
Ceci pourrait-être une explication du dysfonctionnement sous linux ?
Marsh Posté le 09-08-2011 à 17:26:33
Bonjour à tous,
Voilà dans le cadre de mon boulot je suis en train de migrer des programmes proC d'une architecture Unix (assimilée 32 bits) vers une architecture Linux (RedHat 5) 64 bits.
Dans l'un de mes programmes j'utilisais la fonction system afin d'executer la commande ls dans le but de tester l'existence d'un fichier.
Sous unix la fonction system me retournait bien 0 et tout se passait bien. Par contre sous Linux la fonction me retourne -1, j'ai tout vérifier (droits d'accès aux répertoires etc.....) et je ne comprends pas pourquoi il me retourne ce -1. Alors que lorsque je fais un petit programme (sous Linux) avec uniquement l'appel à la fonction system, celle-ci me renvoie bien 0
Code :
sprintf(you_do, "/bin/ls %s",mon_fichier);
erreur = system(you_do);
printf ("Retour ls : %d", erreur);
Si quelqu'un aurait une idée ou n'importe je suis preneur
merci d'avance pour votre aide