Proc Searchpath et infoSystem en C ??

Einbert

Membre expert
Club iGen
24 Avril 2001
1 239
20
J'ai 2 petites questions, dont pour une j'aurais une solution, mais je cherche plus facile :

1) Existe-t-il une procédure dans une librairie quelconque qui me permette de me dire sur quel OS est utilisé ? Il y aurait une petite lumière je pense avec la proc. main(), resp. si je déclare
Bloc de code:
ben je pourrais avoir certainement le renseignement recherché avec envp en choisissant le bon i
smile.gif

Mais je suis sûr qu'il doit exister plus simple...Quelqu'un la connaîtrait-il ??

2)Je cherche a créé une proc. en C qui me permette de rechercher un fichier donner en argument... Là encore j'ai une petite idée, resp. en utilisant la série des execv, execle, etc. où je pourrais ensuite faire appel à un script...
Mais j'aimerais pouvoir éviter ceci, ce n'est pas vraiment le must et ça devrait pouvoir fonctionner sur n'importe quel OS...donc existe-t-il là aussi une proc. en C qui me permette de faire ceci ???

Merci pour vos réponses

++
 
Salut,

Je vais essayer de te donner qq conseils (les miens!!!) vu que je suis en école d'ingé en info.
Ils sont peut être pas les meilleurs.

1) Je pense que ce que tu veux faire est la meilleur sol. Cest vrai qu'elle est peut être un peu compiquée, mais c'est la seule que je vois et elle est sûre et performante.
Par contre, j'ai toujours déclaré les args du "main" comme ceci:

main(int argc, char * argv[], char *env[])

Je ne sais pas d'où tu sors ton "p" pour la variable d'environement, mais je ne crois pas que ça change grand chose.
Tu peux connaitre les noms des champs accessibles à partir de la variable d'environement avec la commande (sous un terminal) ci-dessous (que sous OS X, je crois; enfin j'ai jamais essayé sous Linux ou autres...):

printenv [argument optionnel: nom du champ demandé]

J'ai regardé est apparement tu as des champs qui correspondent à ce que tu cherches.

2)Pour rechercher un fichier passé en argument d'une proc. C, je pense qu'il faut utiliser les fonctions d'ouverture et de lecture dans un repertoire:

opendir et readdir

Tu peux voir leur utilisation avec le "man" d'un terminal.
Il faut utiliser des structures assez chiante (struct dirent et sruct stat).
Si tu veux un peu plus d'aide, je peux t'envoyer des fonctions qu'on a codés et qui reprennent les commandes "ls" et "cp".
Je te conseil de faire du recursif, c'est plus propre; c'est ce qu'on avait fait pour refaire les commandes ci-dessus.


J'espere que je t'aurai aidé au moins un peu.

A +

M.R.
 
Salut Matnad,

Merci pour tes reponses.

Pour le main, tu peux declarer les arguments comme tu veux, vu que main(), ben ce n'est rien d'autre qu'une bête procédure.

Pour ce que je recherche sur l'info de l'OS, ma solution ne me paraît pas terrible, car je peux avoir les info de l'environment avec le bout de code suivant :


#include <stdio.h>

main(int argc, char *argv[], char *argp[])
int i;
for(i=0;argp != NULL; i++)
printf("%s\n",argp);
}

et cela me retourne exactement la même chose que si je tape printenv dans le terminal...Apparemment, ce qui ne m'étonne pas du tout, ben chaque OS gère l'environment différemment, resp. l'info donné avec le bout de code n'est pas le même sous Win que sur OS x... Sous win, je crois que la commande DOS set donne exactement le même résultat que le bout de code ci-dessus...à confirmer...D'après ce que j'ai pu recueillir chez des pc-istes, ben chez eux l'info sur le système d'exploitation se trouve apparemment dans argp[9], ce qui ne colle pas avec ce que l'on a sur OS X...donc je ne peux utiliser ceci, car n'est pas portable sur d'autre machine...

Mais je crois qu'avec ce que tu me donnes comme info par la suite, me permettra d'éliminer mon problème numéro 1)....
Pour le ls, j'ai le code sous les yeux...par contre le cp m'intéresserait de voir...
Bon, je vais m'y remettre... ah oui, si jamais moi j'étudie là http://diuf.unifr.ch/admin/iiuf-fr.html
Je te tiendrai au courrant...il est possible que j'aurai même pas besoin d'utiliser ces opendir, etc....tout dépend...

++
 
Bonjour,

Si tu écrit ton programme en C ou dérivé, des constantes définissent sur quel OS tu es compilé et donc exécuté. Il est en effet evident qu'un code compilé pour du PPC ne detectera jamais une version de Windows.
Ensuite, en conditionnel, tu peut utiliser certaines fonctions spécifiques pour interroger le systeme et obtenir la version précise du systeme.
Par exemple sur Mac, la constante powerc est definie sur Mac PPC (uniquement sous Codewarrior, Sur un autre compilateur tu peut avoir d'autres constantes)
#ifdef powerc
long reponse;

Gestalt(gestaltSystemVersion,&reponse);
// réponse contient la version du systeme

#endif


Cordialement
 
Bonjour,

Sur le Codewarrior par exemple, la constante __INTEL__ est definie sur PC.

Ce qui donne

#ifdef __INTEL__

// test PC

#else
// test MAC

#endif

une astuce consiste également a jouer sur le little/big indian :

short magic=0x1234;
char * p=(char *)&magic;

if(*p==0x12)
// C'est du mac
else
// C'est du pc

Cordialement
 
<BLOCKQUOTE><font size="1" face="Verdana, Geneva">quote:</font><HR>Posté à l'origine par Didier Guillion:
Il est en effet evident qu'un code compilé pour du PPC ne detectera jamais une version de Windows.
<HR></BLOCKQUOTE>

Ceci est en effet évident
grin.gif


En fait, ce qu'il faudrait faire c'est lors l'entrée en action du préprocesseur, ben faudrait justement pouvoir détecter si le Système est Windows, ce qui me permettrait de désactiver tout ce qui conerne des trucs spécifiques à d'autres platformes...Du style

#if (System == Windows)

blablabla

#endif

++
 
Tiens...Je ne connaissais pas ce petit truc...Merci
smile.gif


Comment ça marche exactement ce petit truc ?

++
 
Bonjour,

C'est basé sur le principe que les processeurs Motorola et Intel ont deux manières totalement différentes de ranger les données en mémoire vive.

Si l'on prends une donnée sur 16 bits (2 octets) par exemple 0x1234 (4600 décimal), 0x12 est appellé le poids fort, 34 le poids faible.

Intel mémorise les données poids faible suivi de poids fort, Motorola fait l'inverse (ce qui est d'ailleurs beaucoup plus logique)

Cette inversion des données est un point crucial lorsque l'on programme sur les deux plateformes. Accéder à une zone mémoire contenant des données 16 bits avec un pointeur de type char * nécessite des conversions selon le processeur qui a rangé les informations.

Il faut y penser quand :

- Tu sauvegarde des données binaires dans un fichier sur un Mac pour le relire sur PC et versa de vice.

- Tu lit un fichier ressource (créé avec Resedit) sur PC

- Tu lit un fichier PICT sur un PC

etc

Tu doit convertir chacun des éléments avant de pouvoir l'utiliser.

Cordialement