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

  FORUM HardWare.fr
  Programmation
  C

  Programme C Linux : fichier de conf spécifique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Programme C Linux : fichier de conf spécifique

n°1327476
jipo
Kamoulox !
Posté le 17-03-2006 à 17:07:41  profilanswer
 

Slt,
 
Je réécris un soft en C sous Linux (en Fortran avant)
 
Je débute en C
Mon programme s'appelle toto. Je désire sauvegarder un fichier de configuration avec des variables telles que  
chemin1= ...
titi=...
etc= ...
J'ai donc créé un fichier ".toto" comme les fichiers de config que je dépose dans le même répertoire que mon appli : ex : "/usr/DEV/toto/".
 
1) Y a-t-il une api simple qui permet de gérer la lecture et la sauvegarde de paramètres dans un fichier de conf (vu que pas mal de programmes ont un fichier de conf), genre les apis pour lire les fichiers INI sous Windows ?
 
2) sinon je vais utiliser les fonctions C classiques pour lire le fichier (fopen, fgets, etc ...): Comment puis-je en C, récupérer le nom du répertoire où réside le programme toto en cours d'execution pour pouvoir ouvrir le fichier de conf ".toto" dans le même répertoire ?
 
Merci d'avance  [:aztechxx]


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
mood
Publicité
Posté le 17-03-2006 à 17:07:41  profilanswer
 

n°1327555
nargy
Posté le 17-03-2006 à 19:44:02  profilanswer
 

En général, on met plutot les fichiers de confs dans le répertoire de l utilisateur ($HOME), plutot que là ou le programme s execute.
 
Pour le répertoire utilisateur:

Citation :


       #include <stdlib.h>
       char *getenv(const char *name);


 
A utiliser de la sorte:

Citation :


       char * home=getenv("HOME" );
       if(home && *home) { ... }


 
Pour le répertoire courant:

Citation :


       #include <unistd.h>
       char *getcwd(char *buf, size_t size);
       char *get_current_dir_name(void);
       char *getwd(char *buf);


 

n°1327657
jipo
Kamoulox !
Posté le 18-03-2006 à 00:39:26  profilanswer
 

Je te remercie beaucoup pour ces informations précieuses ...  ;)  
 
Effectivement je pourrais utiliser getenv pour la recup de Home ... cependant je souhaite que tous les utilisateurs de l'application aient accés à un meme fichier avec des parametres communs
av
Je pense que je vais utiliser les fonctions de recuperation du répertoire courant. Je vois qu'il s'agit d'une lib unistd. Cette lib est elle standard sur tous les linux ? Où peut on, sur quel site, avoir une référence de l'ensemble des libs standards C pour l'environnement Linux, comme la lib unistd ?  
 
Merci ... Je sens que cela avance ...
 
PS : je ne comprend pas le test : if(home && *home) : pourquoi pas tout simplement : if (home) ?  [:aztechxx]  


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
n°1327658
kadreg
profil: Utilisateur
Posté le 18-03-2006 à 00:40:37  profilanswer
 

jipo a écrit :


Effectivement je pourrais utiliser getenv pour la recup de Home ... cependant je souhaite que tous les utilisateurs de l'application aient accés à un meme fichier avec des parametres communs


 
dans ce cas, on le met dans /etc; genre /etc/toto


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°1327681
jipo
Kamoulox !
Posté le 18-03-2006 à 00:58:52  profilanswer
 

A quoi correspond etc ? Plutot pourquoi doit etre utilisé ce répertoire en règle général ?
 
J'ai vérifié les fonctions de recuperation du répertoire courant mais je ne suis pas sur qu'elles correspondent à ce que je cherche ... Je ne veux pas le répertoire courant (celui obtenu apres un chdir). Je veux obtenir le répertoire où est installé le programme en cours d'execution ... Les deux répertoires ne sont pas les mêmes : ce n'est pas parce que j'execute un programme que son répertoire hote devient le répertoire courant, n'est-ce pas ?  :hello:    
 
Pouvez-vous me le confirmer ?   :)


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
n°1327683
kadreg
profil: Utilisateur
Posté le 18-03-2006 à 01:00:35  profilanswer
 

jipo a écrit :

A quoi correspond etc ? Plutot pourquoi doit etre utilisé ce répertoire en règle général ?


 
il sert à ranger les fichiers de configurations du système et des application au niveau global (à la différence des configs par utilisateurs,; qui sont dans $HOME


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°1327707
nargy
Posté le 18-03-2006 à 01:33:57  profilanswer
 

Citation :


Les deux répertoires ne sont pas les mêmes : ce n'est pas parce que j'execute un programme que son répertoire hote devient le répertoire courant, n'est-ce pas ?


 
Tout à fait.
 
Le  répertoire où se situe le programme n est pas très facile à récupérer.
 
Soit il se trouve dans l argument n°0 passé à ton programme par ex.:
/bin/toto
Soit c est un pat hrelatif dans l argument n°0 passé à ton programme par ex.:
../toto
Soit il est trouvé dans la liste des répertoire de la variable d environnement $PATH:
toto
 
Une autre approche, spécifique à linux, est de récupérer les infos du lien /proc/self/exe qui pointe vers le programme en cours d execution:

Citation :


       #include <unistd.h>
       int readlink(const char *path, char *buf, size_t bufsiz);


 
En ce qui concerne la librairie unistd, je n ai aucune idée s il existe un manuel qui liste toutes ses fonctions (en tout cas sous linux).
Très rarement, si j en ai besoin, je regarde directement dans /include/unistd.h (en plus c est instructif), chaque fonction possède un manuel, essaye:
man readlink
et si tu n a pas l habitude de <<man>>, lit:
man man
 
Pour les fichiers ini, il ne me seble pas qu il y ait quelquechose de standard sous linux, mais tu peut utiliser scanf() et printf() si les valeurs que tu va y mettre ont une limite en nombre de caractères, et que les utilisateurs ne viennent pas le bidouiller.

n°1327717
matafan
Posté le 18-03-2006 à 04:31:59  profilanswer
 

jipo a écrit :

Comment puis-je en C, récupérer le nom du répertoire où réside le programme toto en cours d'execution pour pouvoir ouvrir le fichier de conf ".toto" dans le même répertoire ?


Tu ne peux pas. Mais comme d'autres l'ont dit plus haut, c'est de toute façon une mauvaise idée. Le fichier de conf devrait aller sous /etc.

n°1327751
Emmanuel D​elahaye
C is a sharp tool
Posté le 18-03-2006 à 10:35:28  profilanswer
 

jipo a écrit :

je ne comprend pas le test : if(home && *home) : pourquoi pas tout simplement : if (home) ?


C'est une forme simplifiée de

Code :
  1. if (home != NULL && strlen (home) != 0)



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1327766
nargy
Posté le 18-03-2006 à 11:08:41  profilanswer
 

Citation :


je ne comprend pas le test : if(home && *home) : pourquoi pas tout simplement : if (home) ?


 
C est un test de validité d une chaîne de caratère. Celà teste si le pointeur retourné est valide, mais aussi si la chaîne n est pas vide, histoire d éviter de coller ``toto.conf`` à une chaîne vide:

Code :
  1. #define TOTO_CONF "toto.conf"
  2. size_t home_len=strlen(home);
  3. char* toto_conf=malloc(sizeof(char)*(len_home+strlen(TOTO_CONF+1)));
  4. strncpy(toto_conf, home, home_len);
  5. strcpy(toto_conf+home_len, TOTO_CONF);
  6. FILE* f_conf=fopen(toto_conf,"r" );
  7. if (f_conf) { ..... }
  8. else { perror(toto_conf); exit(1); }


 
Si $HOME est vide, le fichier ``toto.conf`` peut très probablement être ouvert (avec utilisateur root) dans le répertoire courant, c.à.d. sûrement pas là où il faut.
 
Tester la longeur de la chaîne avec strlen est une autre possibilité puisqu on en a besoin plus tard, mais théoriquement moins efficace puisque (*home) ne teste finalement que le 1er octet (char) au lieu d un mot machine entier (size_t) un appel à strlen et un saut.


Message édité par nargy le 18-03-2006 à 11:13:02
mood
Publicité
Posté le 18-03-2006 à 11:08:41  profilanswer
 

n°1327791
jipo
Kamoulox !
Posté le 18-03-2006 à 11:53:50  profilanswer
 

Merci à tous pour le temps que vous avez pris pour me renseigner ...
SUPER !
J'ai toutes les infos pour progresser ...


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
n°1327797
nargy
Posté le 18-03-2006 à 12:04:18  profilanswer
 

OOps!
j ai oublié de traité le cas où $HOME ne contient pas de / final:
 

Code :
  1. #define TOTO_CONF "toto.conf"
  2.     // taille de la chaîne $HOME
  3.     size_t home_len=strlen(home);
  4.     // allouer taille de la chaîne $HOME+taille de toto.conf + 1 slash + 1 zéro final
  5.     char* toto_conf=malloc(sizeof(char)*(len_home+strlen(TOTO_CONF+1+1)));
  6.     // copier $HOME
  7.     strncpy(toto_conf, home, home_len);
  8.     // ajouter slash
  9.     toto_conf[home_len]='/';
  10.     // ajouter toto.conf et zero final
  11.     strcpy(toto_conf+home_len+1, TOTO_CONF);
  12.     // ouvrir fichier
  13.     FILE* f_conf=fopen(toto_conf,"r" );
  14.     if (f_conf) { ..... } // lire ficher
  15.     else { perror(toto_conf); exit(1); } // erreur
  16.     // libérer la mémoire allouée
  17.     free(toto_conf);


 


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

  Programme C Linux : fichier de conf spécifique

 

Sujets relatifs
Ecrire en binaire dans un fichier...ecriture fichier texte avec choix dossier destination par utilisateur
création fichier texte avec choix du dossier par l'utilisateurupload de fichier mais : SAFE MODE Restriction in effect.
[VBA] fichier d'aide compilélancer un programme a partir du html
lancement programme IDLEfichier swf
modification d' un fichier serveur par un poste client 
Plus de sujets relatifs à : Programme C Linux : fichier de conf spécifique


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