Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1614 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] : Problème avec la fonction system

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] : Problème avec la fonction system

n°2094242
sal1
Posté le 09-08-2011 à 17:26:33  profilanswer
 

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

mood
Publicité
Posté le 09-08-2011 à 17:26:33  profilanswer
 

n°2094246
theshockwa​ve
I work at a firm named Koslow
Posté le 09-08-2011 à 17:40:38  profilanswer
 

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
n°2094249
Elmoricq
Modérateur
Posté le 09-08-2011 à 18:10:05  profilanswer
 

Par exemple avec la fonction stat() et la vérification de errno si le code retour est différent de zéro.

n°2094364
sal1
Posté le 10-08-2011 à 10:18:28  profilanswer
 

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.


n°2094390
theshockwa​ve
I work at a firm named Koslow
Posté le 10-08-2011 à 11:57:37  profilanswer
 

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


---------------
last.fm
n°2094403
sal1
Posté le 10-08-2011 à 12:37:17  profilanswer
 

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.


n°2094404
sal1
Posté le 10-08-2011 à 12:40:00  profilanswer
 

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 ?


n°2094415
Elmoricq
Modérateur
Posté le 10-08-2011 à 13:38:30  profilanswer
 

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

n°2094423
sal1
Posté le 10-08-2011 à 13:59:55  profilanswer
 

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
n°2094493
Elmoricq
Modérateur
Posté le 10-08-2011 à 16:18:36  profilanswer
 

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 ?

mood
Publicité
Posté le 10-08-2011 à 16:18:36  profilanswer
 

n°2094503
Un Program​meur
Posté le 10-08-2011 à 16:38:53  profilanswer
 

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)
n°2094507
Elmoricq
Modérateur
Posté le 10-08-2011 à 16:46:47  profilanswer
 

Un ulimit trop bas ?

n°2094513
sal1
Posté le 10-08-2011 à 16:57:07  profilanswer
 

Qu'est que le "ulimit"?

Elmoricq a écrit :

Un ulimit trop bas ?


n°2094515
sal1
Posté le 10-08-2011 à 16:57:38  profilanswer
 

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,


n°2094519
Elmoricq
Modérateur
Posté le 10-08-2011 à 17:01:10  profilanswer
 

sal1 a écrit :

Qu'est que le "ulimit"?


 
man ulimit

n°2094524
sal1
Posté le 10-08-2011 à 17:08:27  profilanswer
 

J'ai bien vu ce qu'était ulimit mais je ne vois pas comment l'utiliser ici !!
 

Elmoricq a écrit :


 
man ulimit


n°2094542
Un Program​meur
Posté le 10-08-2011 à 17:44:37  profilanswer
 

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)
n°2094654
sal1
Posté le 11-08-2011 à 11:33:11  profilanswer
 

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  ?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] : Problème avec la fonction system

 

Sujets relatifs
[ C# ] ListView qui consomme un maxProblème Allopass
Spécial pack-->telecharger des cours complets de: C,C++,JAVA,GTK,Linuxxsl problème de recuperation de valeur
Problème boucle VBAObjet Submit qui me pose probleme
[MySQL ]Problème sur ON DUPLICATE KEY UPDATEProblème pour utiliser Vlookup en VBA
Problème de l'utilisation de Scanner ( dans java )problème sur tableau C++
Plus de sujets relatifs à : [C] : Problème avec la fonction system


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR