[C] Faire appel à une fonction dans une autre fonction

Faire appel à une fonction dans une autre fonction [C] - C - Programmation

Marsh Posté le 04-04-2006 à 10:03:48    

Bonjour tous,
Je vous prie de bien vouloir m'aider.
J'ai une fonction appelée fonctde(paramètre) qui me retourne un nombre et je voudrais l'utiliser dans une autre fonction. Comment faire pour l'appeler?
Piste: exec, system mais je n'en suis pas sure et je ne connais pas la syntaxe exacte.
Merci pour votre attention et votre aide.

Reply

Marsh Posté le 04-04-2006 à 10:03:48   

Reply

Marsh Posté le 04-04-2006 à 10:16:36    

je ne comprends pas trop ton problème : il n'y a rien de spécial à faire pour appeler une fonction C depuis une autre fonction C:

Code :
  1. int fonc1( int i )
  2. {
  3.   int result;
  4.   /* ... */
  5.   return result;
  6. }
  7. int fonc2( int i )
  8. {
  9.   int j = fonc1(i);
  10.   /* ... */
  11.   return j;
  12. }


 
la fonction system() sert à appeler une commande externe à ton programme, comme tu pourrais le faire dans un shell.

Code :
  1. system( "echo toto" );


la fonction exec() est un peu plus compliquée et je ne suis pas sûr que ce soit de ton niveau encore. (man exec si tu veux quand même des détails)


Message édité par franceso le 04-04-2006 à 10:22:46

---------------
TriScale innov
Reply

Marsh Posté le 04-04-2006 à 10:46:52    

man exec ne donne rien. Mon programme n'a-t-il pas besoin que je lui mentionne que je vais utiliser une fonction déjà existante?
merci.
Penses-tu que 'cat /proc/pid/status' soit un fichier?
Comment récupérer le résultat?
Peut-on écrire res = "cat /proc/pid/status"?
Merci

Reply

Marsh Posté le 04-04-2006 à 10:49:26    

En unix, tout est fichier.
 
Non,tu ne peux pas écrire

Code :
  1. res = "cat /proc/pid/status"


 
A priori si c'est pour faire ce genre de traitement, des scripts shell semblent plus adaptés qu'utiliser le langage C.

Reply

Marsh Posté le 04-04-2006 à 10:53:44    

Donc si tout est fichier alors je peux utiliser directement 'fopen'?
Le problème, je l'ai déjà fait mais ça ne marche pas.

Reply

Marsh Posté le 04-04-2006 à 11:01:15    

Citation :

Le problème, je l'ai déjà fait mais ça ne marche pas.


 
:??:

Reply

Marsh Posté le 04-04-2006 à 11:03:11    

en fait j'ai déjà utilisé 'fopen' pour ouvrir les fichiers. l'erreur est que le système ne connait pas le chemin.
Merc

Reply

Marsh Posté le 04-04-2006 à 11:09:17    

question de droits peut etre ?

Reply

Marsh Posté le 04-04-2006 à 11:12:40    

vinoromano a écrit :

en fait j'ai déjà utilisé 'fopen' pour ouvrir les fichiers. l'erreur est que le système ne connait pas le chemin.
Merc


 
bon
mentre ton code.  :p

Reply

Marsh Posté le 04-04-2006 à 11:14:26    

Voici mon code
 
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
 
/*Lecture de /proc*/
 
//Définition du type du tableau des pid
typedef struct {
   int nb1;
   int nb2;
   char t1[40];
   char t2[40];
   char t3[40];
   char t4[40];
     }bloc;
             
//==============================================================================
//
//------------------------------------------------------------------------------            
//nombre de lignes du fichier lu
int nblignefichier(char arg2[40])
   {
   int n = 0; /* nombre de lignes lues */
   char ligne[256];
   FILE *f = fopen( arg2, "r" ); /* ouvre en lecture */
   if (f==NULL) {
     printf("erreur ouverture\n" );
     return 0;        /* sort du programme (code erreur 1) */
   }
   while (fgets( ligne, 256, f ) != NULL) { /* essai lecture ligne */
       n++;                                  
   }
   fclose(f);  /* ferme le fichier */
   return n;
  }
//exec("pidof  " );  
//==============================================================================
//
//------------------------------------------------------------------------------
// Création du tableau des processus importants
       
        //nombre de lignes du tableau des processus importants
      int nblignetab(char * process1[20])
      {
          int nb;
          nb=0;
          while (process1[nb]!=NULL)
          {
                nb++;
          }
                return nb;
      }
  //==============================================================================
//
//------------------------------------------------------------------------------
//afficher le tableau des processus importants????
void affichprocess(char * process2[20])//utiliser int main void???
{      
         
         int i, nb;
         nb = nblignetab(process2);
         for (i=0; i<nb; i++)  
         {
           printf ("%s\n", process2[i]);
         }
           
   
}
//==============================================================================
//
//------------------------------------------------------------------------------
/*Déterminer les pid des processus importants*/
int pidde(char * process3[20])
{
int i,nb;
int pidde[20];
nb=nblignetab(process);
for (i=0; i<nb; i++)
     {
    pidde[i] = pidof(process[i]);
     }    
return pidde;
}
 
//==============================================================================
//
//------------------------------------------------------------------------------
/*Vérifier si les pid de pidde sont dans /proc*/
int verif(bloc *b,int pidde[20],int taille)
{
int tmp,i,j;
int erreurpid[nb];
nb = nblignetab(pidde);
int erreurpid[20];
 
for(i=0;i<nb;i++)
{
  erreurpid[i]=0;
}
 
for (i=0; i<nb; i++)
    {
          tmp = pidde[i];
          for (j=0; j<taille; j++)
          {
              if (tmp == b[j].nb1)// || (tmp == b[j].nb2))
              {
                return 1;
              }
          }
           for(j=0;j<taille;j++)
           {
              if (tmp == b[j].nb2)
              {
                return 1;
              }                                  
           }
            n1 = atoi(b[0].t1);
            n2 = atoi(b[0].t2);
             
        //    if (tmp == n1)
//              {
//                return 1;
//              }
//            if (tmp == n2)
//              {
//                return 1;
//              }          
           printf("Ce processus ne fonctionne pas" );
           erreurpid[i]=tmp;
           
     }
             
  return erreurpid;        
     
}
//==============================================================================
//
//------------------------------------------------------------------------------
int main(void)
{
int pidde1[20];
int erreurpid1[20];
int i,a,taille,pos1,j,nb;
char *process[20]= {"mysql","apache","bash","blabla","blabla1"} ;//liste de tous les processus importants
 
 pidde1=pidde(process);
 
/*Ouvrir le fichier en lecture seule*/
FILE* lecture = fopen("/proc","r" );
taille = nblignefichier("/proc" );
 
//création du tableau de taille "taille"
bloc b[taille];
 
char nb[255];
 
//remplissage du tableau
for(i=0;i<taille;i++)
{
 fscanf(lecture, "%s", &nb);
 b[i].nb1 = atoi(nb);
 fscanf(lecture, "%s", &nb);
 b[i].nb2 = atoi(nb);
 fscanf(lecture, "%s", &b[i].t1);
 fscanf(lecture, "%s", &b[i].t2);
    fscanf(lecture, "%s", &b[i].t3);
    fscanf(lecture, "%s", &b[i].t4);
   
 
}
/* pclose(fichier);*/
fclose(lecture);
 
 //affichage du tabeau
 for(i=0;i<taille;i++)
 {
 printf("%d %d %s %s %s %s\n",b[i].nb1,b[i].nb2,b[i].t1,b[i].t2,b[i].t3,b[i].t4);
 }
 
 erreurpid1=verif(b,pidde1,taille);
 
 
 system("PAUSE" );
 
// la 1ere colonne s'obtient avec b[i].nb1
// la 2e colonne s'obtient avec b[i].nb2
return EXIT_SUCCESS;
 
}
 
 
//Donner le statut des processus les plus importants
 
int i, nb;
nb = nblignetab(pidde);
for (i=0; i<nb; i++)
{
     res = "/proc/pidde[i]/status";//syntaxe???
}
 
 
   
 
 

Reply

Marsh Posté le 04-04-2006 à 11:14:26   

Reply

Marsh Posté le 04-04-2006 à 11:15:39    

balise [code] stp

Reply

Marsh Posté le 04-04-2006 à 11:16:33    

C'est quoi ?
balise [code] stp

Reply

Marsh Posté le 04-04-2006 à 11:18:00    

exemple:
 
[ code ] code [ / code ] =>

Code :
  1. code


 
et ca évite les smileys intempestifs, c'est plus lisible.

Reply

Marsh Posté le 04-04-2006 à 11:20:59    

Citation :

Donc si tout est fichier alors je peux utiliser directement 'fopen'?

fopen() permet uniquement d'ouvrir un fichier à partir de son nom dans le filesystem (en gros, ça concerne les fichiers que tu peux voir en faisant un 'ls', ce qui inclut déjà des fichiers "bizarres" ).
 
Mais la notion de fichier est beaucoup plus générale dans le monde unix. N'importe quel flux ordonné de données peut être considéré comme un fichier (et d'ailleurs tu ne fais naturellement pas de différence entre le flux de données provenant d'un clavier ou d'un fichier). Tu peux utiliser ceci pour faire communiquer entre eux plusieurs processus (c'est ce qui est fait par ton shell quand tu lances par exemple une commande du genre "cat /proc/pid/status | grep ..." : il s'agit simplement de connecter le flux de sortie du premier processus au flux d'entrée du deuxième à travers un pipe)
pour faire ça en C, il y a plein de moyens. L'un d'entre eux (peut-être le plus simple) étant d'utiliser popen() qui fonctionne un peu comme fopen() :

Code :
  1. FILE *cmd = popen( "echo foo", "r" );
  2.   if( status == NULL )
  3.     {
  4.       perror( "popen" );
  5.     }
  6.   /* tu peux utiliser cmd comme n'importe quel (FILE*) */


 
 
Mais _darkalt3_ a raison : suivant ce que tu veux faire, il peut être beaucoup plus intéressant de faire du script shell ou perl ou quelque chose du genre...


---------------
TriScale innov
Reply

Marsh Posté le 04-04-2006 à 11:29:21    

Je ne connais pas perl encore moins shell. Je connais C et je débute. Je vais essayer de me renseigner sur perl.
Merci pour les infos.

Reply

Marsh Posté le 04-04-2006 à 11:31:09    

si tu connais "cat", saches qu'un script shell est composé de ce genre de commandes, soit les commandes unix. Ca ne devrait pas te poser trop de problèmes.

Reply

Marsh Posté le 04-04-2006 à 11:31:10    

Code :
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include <stdlib.h>
  4. /*Lecture de /proc*/
  5. //Définition du type du tableau des pid  
  6. typedef struct {
  7.    int nb1;
  8.    int nb2;
  9.    char t1[40];
  10.    char t2[40];
  11.    char t3[40];
  12.    char t4[40];
  13.      }bloc;
  14.            
  15. //==============================================================================  
  16. //  
  17. //------------------------------------------------------------------------------             
  18. //nombre de lignes du fichier lu  
  19. int nblignefichier(char arg2[40])
  20.    {
  21.    int n = 0; /* nombre de lignes lues */
  22.    char ligne[256];
  23.    FILE *f = fopen( arg2, "r" ); /* ouvre en lecture */
  24.    if (f==NULL) {
  25.      printf("erreur ouverture\n";
  26.      return 0;        /* sort du programme (code erreur 1) */
  27.    }
  28.    while (fgets( ligne, 256, f ) != NULL) { /* essai lecture ligne */
  29.        n++;                                 
  30.    }
  31.    fclose(f);  /* ferme le fichier */
  32.    return n;
  33.   }
  34. //exec("pidof  ";   
  35. //==============================================================================  
  36. //  
  37. //------------------------------------------------------------------------------  
  38. // Création du tableau des processus importants  
  39.        
  40.         //nombre de lignes du tableau des processus importants  
  41.       int nblignetab(char * process1[20])
  42.       {
  43.           int nb;
  44.           nb=0;
  45.           while (process1[nb]!=NULL)
  46.           {
  47.                 nb++;
  48.           }
  49.                 return nb;
  50.       }
  51.   //==============================================================================  
  52. //  
  53. //------------------------------------------------------------------------------  
  54. //afficher le tableau des processus importants????  
  55. void affichprocess(char * process2[20])//utiliser int main void???  
  56. {     
  57.          
  58.          int i, nb;
  59.          nb = nblignetab(process2);
  60.          for (i=0; i<nb; i++) 
  61.          {
  62.            printf ("%s\n", process2[i]);
  63.          }
  64.            
  65.    
  66. }
  67. //==============================================================================  
  68. //  
  69. //------------------------------------------------------------------------------  
  70. /*Déterminer les pid des processus importants*/
  71. int pidde(char * process3[20])
  72. {
  73. int i,nb;
  74. int pidde[20];
  75. nb=nblignetab(process);
  76. for (i=0; i<nb; i++)
  77.      {
  78.     pidde[i] = pidof(process[i]);
  79.      }   
  80. return pidde;
  81. }
  82. //==============================================================================  
  83. //  
  84. //------------------------------------------------------------------------------  
  85. /*Vérifier si les pid de pidde sont dans /proc*/
  86. int verif(bloc *b,int pidde[20],int taille)
  87. {
  88. int tmp,i,j;
  89. int erreurpid[nb];
  90. nb = nblignetab(pidde);
  91. int erreurpid[20];
  92. for(i=0;i<nb;i++)
  93. {
  94.   erreurpid[i]=0;
  95. }
  96. for (i=0; i<nb; i++)
  97.     {
  98.           tmp = pidde[i];
  99.           for (j=0; j<taille; j++)
  100.           {
  101.               if (tmp == b[j].nb1)// || (tmp == b[j].nb2))  
  102.               {
  103.                 return 1;
  104.               }
  105.           }
  106.            for(j=0;j<taille;j++)
  107.            {
  108.               if (tmp == b[j].nb2)
  109.               {
  110.                 return 1;
  111.               }                                 
  112.            }
  113.             n1 = atoi(b[0].t1);
  114.             n2 = atoi(b[0].t2);
  115.            
  116.         //    if (tmp == n1)  
  117. //              {  
  118. //                return 1;  
  119. //              }  
  120. //            if (tmp == n2)  
  121. //              {  
  122. //                return 1;  
  123. //              }           
  124.            printf("Ce processus ne fonctionne pas";
  125.            erreurpid[i]=tmp;
  126.            
  127.      }
  128.              
  129.   return erreurpid;       
  130.    
  131. }
  132. //==============================================================================  
  133. //  
  134. //------------------------------------------------------------------------------  
  135. int main(void)
  136. {
  137. int pidde1[20];
  138. int erreurpid1[20];
  139. int i,a,taille,pos1,j,nb;
  140. char *process[20]= {"mysql","apache","bash","blabla","blabla1"} ;//liste de tous les processus importants  
  141. pidde1=pidde(process);
  142.  
  143. /*Ouvrir le fichier en lecture seule*/
  144. FILE* lecture = fopen("/proc","r";
  145. taille = nblignefichier("/proc";
  146. //création du tableau de taille "taille"  
  147. bloc b[taille];
  148. char nb[255];
  149. //remplissage du tableau  
  150. for(i=0;i<taille;i++)
  151. {
  152. fscanf(lecture, "%s", &nb);
  153. b[i].nb1 = atoi(nb);
  154. fscanf(lecture, "%s", &nb);
  155. b[i].nb2 = atoi(nb);
  156. fscanf(lecture, "%s", &b[i].t1);
  157. fscanf(lecture, "%s", &b[i].t2);
  158.     fscanf(lecture, "%s", &b[i].t3);
  159.     fscanf(lecture, "%s", &b[i].t4);
  160.    
  161. }
  162. /* pclose(fichier);*/
  163. fclose(lecture);
  164.  
  165. //affichage du tabeau  
  166. for(i=0;i<taille;i++)
  167. {
  168. printf("%d %d %s %s %s %s\n",b[i].nb1,b[i].nb2,b[i].t1,b[i].t2,b[i].t3,b[i].t4);
  169. }
  170.  
  171. erreurpid1=verif(b,pidde1,taille);
  172.  
  173.  
  174. system("PAUSE";
  175. // la 1ere colonne s'obtient avec b[i].nb1  
  176. // la 2e colonne s'obtient avec b[i].nb2  
  177. return EXIT_SUCCESS;
  178. }
  179. //Donner le statut des processus les plus importants  
  180. int i, nb;
  181. nb = nblignetab(pidde);
  182. for (i=0; i<nb; i++)
  183. {
  184.      res = "/proc/pidde[i]/status";//syntaxe???  
  185. }

Reply

Marsh Posté le 05-04-2006 à 09:12:52    

Bonjour,
peut-on faire ceci dans un programme C:
cp /proc/partitions  /root/partitions
Partitions étant un fichier du répertoire /proc.
Le but étant d'utiliser partitions comme un fichier .txt par exemple.
En effet, lorsque j'ouvre /proc/partitions à partir du 'Secure Shell' il n'y a rien à l'intérieur. Mais quand je le copie dans /root, le contenu apparaît comme par magie!!!
Je ne comprends pas trop.
Merci

Reply

Marsh Posté le 05-04-2006 à 09:32:09    

J'ai fait:
system("fichier_source> fichier.dat" ) et ça marche.
Mais je n'arrive pas à l'utiliser.
Merci

Reply

Marsh Posté le 05-04-2006 à 09:36:55    

Citation :

ça marche.Mais je n'arrive pas à l'utiliser.


 
:??:

Reply

Marsh Posté le 05-04-2006 à 09:43:55    

vinoromano a écrit :

J'ai fait:
system("fichier_source> fichier.dat" ) et ça marche.
Mais je n'arrive pas à l'utiliser.


Tu pourrais être moins précis, parce là avec tous ces détails, on est perdu ...
 
Utiliser quoi ? fichier.dat ? Il suffit que l'application appelante ouvre le fichier et lise les données. C'est dur ?


---------------
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/
Reply

Marsh Posté le 05-04-2006 à 10:43:29    

plus exactement system("cat /etc/network/interfaces > /root/interfaces.dat" )
Cela me permet d'utiliser le fichier "interfaces" dans et d'en extraire des informations. Cela marche très bien. Mais en fonction du résultat de 'cat /etc/network/interfaces'  le programme que j'aie fait ne marche pas car apparement le fichier /root/interfaces n'est pas sous la même forme de présentation et je ne sais pas comment faire pour voir le contenu de /root/interfaces.
Je crois que je suis un peu naze, je dois passer à côté de méthodes simples. Merci de votre aide.

Reply

Marsh Posté le 05-04-2006 à 10:45:56    

pourquoi tu ne lis pas directement ton fichier /etc/network/interfaces ?


---------------
TriScale innov
Reply

Marsh Posté le 05-04-2006 à 10:55:57    

et pourquoi en C :??:

Reply

Marsh Posté le 05-04-2006 à 11:02:58    

_darkalt3_ a écrit :

et pourquoi en C :??:

[:plusun]
tant que tu ne nous diras pas quelle est la finalité de tout ça, je persisterai à penser que le script est plus adapté (même si tu n'y connais rien, c'est pas très compliqué à apprendre et on peut faire tout un tas de choses compliquées, même avec des connaissances de base)


Message édité par franceso le 05-04-2006 à 11:03:18

---------------
TriScale innov
Reply

Marsh Posté le 05-04-2006 à 11:03:32    

Je ne peux pas lire directement car cela me met"accès introuvable". En C car c'est le seul langage que je connaisse.
Merci

Reply

Marsh Posté le 05-04-2006 à 11:04:52    

Je vais apprendre donc. Mais où trouver les enseignements névessaires?

Reply

Marsh Posté le 05-04-2006 à 11:10:41    

google :)

Reply

Marsh Posté le 05-04-2006 à 11:32:14    

OK, merci

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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