Segmentation Fault : utilisation de StrCmp(GetEnv(), ...

Segmentation Fault : utilisation de StrCmp(GetEnv(), ... - C - Programmation

Marsh Posté le 25-04-2006 à 17:40:11    

Bonjour,
 
J'ai l'erreur suivante :  
 
Program received signal SIGSEGV, Segmentation fault.
0x00000038dff6f640 in strcmp () from /lib64/tls/libc.so.6
(gdb)
 
En debug via ddd c'est sur la ligne suivante que cela plante :
        if ( strcmp(getenv("HOSTTYPE" ),"SunOS" ) == 0 )
 
Alors qu'en fait la variable d'environnement est bien fixée si je fais un echo $HOSTTYPE.
En y regardant de plus près, je remarque que getenv("HOSTTYPE" ) renvoit un pointeur null ...  
 
POURQUOI ???  :whistle:  
JE sens qu'il y a un truc qui m'échappe sur les variables d'environnement ...  [:aztechxx]  
 


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 25-04-2006 à 17:40:11   

Reply

Marsh Posté le 25-04-2006 à 17:43:19    

Tiré de la manpage de getenv() :
 

RETURN VALUES
     If successful, getenv() returns a pointer to  the  value  in
     the  current  environment;  otherwise,  it  returns  a  null
     pointer


 
C'est explicite.
Tu dois en premier lieu vérifier que getenv() ne te retourne pas un pointeur nul, AVANT d'utiliser strcmp().
Sinon évidemment, cette dernière fonction tentera de comparer en lisant les chars à partir de NULL, ça va pas très bien marcher... => segfault.
 
 
Ensuite, pour ta variable d'environnement, elle doit être exportée pour que cela fonctionne. C'est-à-dire qu'elle sera propagée aux sous-shells. Autrement, elle n'existera que dans le shell courant.

Reply

Marsh Posté le 25-04-2006 à 17:49:13    

Elmoricq a écrit :


Ensuite, pour ta variable d'environnement, elle doit être exportée pour que cela fonctionne. C'est-à-dire qu'elle sera propagée aux sous-shells. Autrement, elle n'existera que dans le shell courant.


 
Merci,
 
Pour ce qui est de la partie C, pas de prob, j'avais compris le PB.  
Par contre tu m'interesses avec ton explication sur l'export de la variable d'environnement ... Mais je comprend pas pourquoi ... Y a-t-il différents types de variables d'environnement ?  [:acherpy]  
 
Je suis sur le terminal, positionné dans le répertoire où se situe le programme qui plante :
1) Je fais "echo $HOSTTYPE" : j'obtiens une valeur
2) je lance le programme "./toto", et paf le segmentation fault ...
 
Que faut il donc faire entre 1 et 2 ?


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 25-04-2006 à 17:53:21    

Je ne sais pas sur quel shell tu es, je pars du principe que tu es sur ksh :
 


<shell> $ machin=truc
<shell> $ echo $machin  
truc
<shell> $ ksh
<sous-shell> $ echo $machin
 
<sous-shell> $ exit
<shell> $ echo $machin
truc
<shell> $ export machin
<shell> $ ksh
<sous-shell> $ echo $machin
truc
<sous-shell> $ exit


 
(pour faciliter l'identification shell<=>sous shell, j'ai mis un prompt fictif)

Reply

Marsh Posté le 25-04-2006 à 18:03:26    

Elmoricq a écrit :

Je ne sais pas sur quel shell tu es, je pars du principe que tu es sur ksh :
 


<shell> $ machin=truc
<shell> $ echo $machin  
truc
<shell> $ ksh
<sous-shell> $ echo $machin
 
<sous-shell> $ exit
<shell> $ echo $machin
truc
<shell> $ export machin
<shell> $ ksh
<sous-shell> $ echo $machin
truc
<sous-shell> $ exit


 
(pour faciliter l'identification shell<=>sous shell, j'ai mis un prompt fictif)


 
Cela ne fonctionne pas dans mon cas. J'ai toujours la même erreur ...
 
En fait comme précisé plus haut, "toto" est l'executable dans le répertoire courant : je l'execute dans le même shell et non pas dans un sous shell.
Je ne comprend toujours pas ce qui se passe ...  
Y a-t-il des variables d'environnement auxquelles un programme executable ne peut pas accéder. Si oui dans quel contexte ?  
 
 
 
 
 
 


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 25-04-2006 à 18:53:05    

Apparemment sans rien faire de particulier les variables sont maintenant lues ...
Miss Terre et Boule de Gum
 
Merci pour l'aide en tout cas !  [:acherpy]


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 01-05-2006 à 20:55:19    

jipo a écrit :

En fait comme précisé plus haut, "toto" est l'executable dans le répertoire courant : je l'execute dans le même shell et non pas dans un sous shell.
Je ne comprend toujours pas ce qui se passe ...  
Y a-t-il des variables d'environnement auxquelles un programme executable ne peut pas accéder. Si oui dans quel contexte ?


 
Elmoricq a fait un lapsus en parlant de "sous-shell". Le vrai terme est "processus fils".
En fait, quand tu es dans un shell, tu peux créer des variables qui seront connues dans ton shell
Exemple
couleur=rouge
echo $couleur
 
Mais cette variable "couleur" ne sera pas connue par les processus lancés à partir de ce shell (processus fils). C'est à dire que si, dans "toto.c" tu fais un getenv("couleur" ) et que tu lances "toto", tu obtiendras NULL car la variable "couleur" n'est pas connue du processus fils qui exécute "toto" (quand on exécutes un programme, le shell courant crée un shell fils et c'est le fils qui exécute le pgm pendant que le père attend la fin du pgm => ce mécanisme permet le lancement d'un pgm en background et les pipe en cascade)
 
Pour qu'une variable soit connue dans les fils, il faut l'exporter
export couleur
 
Ce doit être la raison pour laquelle tu peux faire "echo $HOSTTYPE" mais que cette variable n'est pas connue dans "toto".


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-05-2006 à 21:43:39    

C'était plutôt un abus de langage lorsque je qualifie le binaire de "sous-shell" dans mon premier post.
(je le laisse tel quel pour la postérité :o )


Message édité par Elmoricq le 01-05-2006 à 21:43:59
Reply

Marsh Posté le 01-05-2006 à 22:02:27    

Merci les gars.
 
Je crois que j'ai bien compris l'histoire de l'export. C'est d'ailleurs ce que j'ai fait. Cependant je n'ai eu besoin de le faire qu'une seule fois à chaque session. Vu l'explication ci-dessus, je pensais qu'il fallait le faire à chaque fois avant de lancer le programme ???
 
Pouvez-vous me conseiller un bon bouquin pour comprendre le fonctionnement interne et profond du système Linux ainsi que la programmation système ?
 
 


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 01-05-2006 à 22:11:15    

Exporter une variable est valable dans le shell courant, et ce tant que celui-ci n'a pas été quitté.
Tu n'as donc pas à exporter ta variable pour tous les fils que tu lances.
 
Un vrai bon bouquin pour apprendre, déjà, comment fonctionne le korn-shell, c'est de taper :

man ksh


dans la console.
 
C'est valable pour toutes les commandes, même "man" lui-même.
 
Quant aux bouquins, je n'en connais pas de vraiment bien à te conseiller.

Reply

Marsh Posté le 01-05-2006 à 22:11:15   

Reply

Marsh Posté le 03-05-2006 à 20:38:25    

jipo a écrit :

Vu l'explication ci-dessus, je pensais qu'il fallait le faire à chaque fois avant de lancer le programme ???


Vi, je me suis mal exprimé. J'aurais dû dire que l'export place la variable dans une zone mémoire qui est automatiquement transmise à tous les fils qui seront générés (et les fils des fils, etc)
 

jipo a écrit :

Pouvez-vous me conseiller un bon bouquin pour comprendre le fonctionnement interne et profond du système Linux ainsi que la programmation système ?


Les O'REILLY et les RUBY


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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