[C] : Problème avec la fonction system

: Problème avec la fonction system [C] - C - Programmation

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

Reply

Marsh Posté le 09-08-2011 à 17:26:33   

Reply

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.


---------------
last.fm
Reply

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.

Reply

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


Reply

Marsh Posté le 10-08-2011 à 11:57:37    

parce que tu arrives à faire des appels à system sans modifier le source ?


---------------
last.fm
Reply

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.


Reply

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 ?


Reply

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. :o

Reply

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.
Que contient errno ?

 





Message édité par sal1 le 10-08-2011 à 14:07:35
Reply

Marsh Posté le 10-08-2011 à 16:18:36    

Pour de la documentation, tu peux aussi taper :
man <fonction C>
 

RETURN VALUES
     The system() function executes vfork(2) to  create  a  child
     process that in turn invokes one of the exec family of func-
     tions (see exec(2)) on  the  shell  to  execute  string.  If
     vfork()  or the exec function fails, system() returns -1 and
     sets errno to indicate the error.
 
ERRORS
     The system() function fails if:
 
     EAGAIN          The system-imposed limit on the total number
                     of  processes  under  execution  by a single
                     user would be exceeded.
 
     EINTR           The system() function was interrupted  by  a
                     signal.
 
     ENOMEM          The new process requires more memory than is
                     available.


 
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 ?

Reply

Marsh Posté le 10-08-2011 à 16:18:36   

Reply

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,


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 10-08-2011 à 16:46:47    

Un ulimit trop bas ?

Reply

Marsh Posté le 10-08-2011 à 16:57:07    

Qu'est que le "ulimit"?

Elmoricq a écrit :

Un ulimit trop bas ?


Reply

Marsh 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,


Reply

Marsh Posté le 10-08-2011 à 17:01:10    

sal1 a écrit :

Qu'est que le "ulimit"?


 
man ulimit

Reply

Marsh 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 :


 
man ulimit


Reply

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.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 11-08-2011 à 11:33:11    

Un Programmeur a écrit :


 
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.


 
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  ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed