Salut a tous

J'ai un repertoire qui contient n fichier text. Et un processus pere doit creer pour chaque fichier un processus fils et chaque processus fils fait la recherche dans son fichier .et des qu'un processus fils trouve un mot M donné dans un fichier la recherche s'arrete et le pere met fin aux autre fils qui cherchent le mot .et si aucun fils ne trouve le mot on retoune qu'on a pas trouver .

J'ai ecrit les code de recherche mais je n'arrive pas faire la relation entre eux pour construire un executable qui marche


Premier code



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include<string.h>
#include <sys/wait.h>
#include "tp.h"
 
int chercher (char * buffer, char * word)
	      {
		char S[50]; int i =0, j; char c;
                while ((c != '\t') && (c != '\r') && (c != '\n') && (i < strlen(buffer)) && (c != '\0'))
				 {
				   j = 0;
                                   strcpy(S,"");
				    while ((c != '\t') && (c != '\r') && (c != ' ') && (c != '\n') && (i < strlen(buffer)) && (c != '\0'))
					  {
					   c = buffer[i];
					   S[j] = c;
					   j++;
					   i++; 
					  }
				    if(j > 0) 
      		                    	      {
						S[j-1]='\0';
	                                        if(!strcmp(S,word)) return 0; 
		  			        while ((c != '\t') && (c != '\r') && (c == ' ') && (c != '\n') && (i < strlen(buffer)) && (c != '\0'))
 
					       {
					         c = buffer[i];
					         i++; 
				               }
					       i--;
 
					      }
				     else return -1 ;	
		                    }
		return -1;
                }
 
void reader ( FILE * stream, char * word )
                              {
				char buffer [1024]; int ligne = 0;
				while (! feof ( stream ) && ! ferror ( stream ) && fgets ( buffer , sizeof ( buffer ) , stream ) != NULL ) 
					{					      
					  fputs ( buffer , stdout) ;
					  ligne ++;
					  if(!chercher (buffer,word)) 
						                     {
 
							               printf("je suis le processus %d et j'ai trouvé le mot %s à la ligne %d \n",getpid(),word,ligne);
								       exit(ligne);
								     }
					}
 
				exit(0);
 
			      }
 
 
int main (int argc, char** argv)
{
 if (argc == 3) 
		{
		 FILE * stream = fopen(argv[1],"r");
		 reader (stream, argv[2]);
		}
else printf ("Le nombre de paramètres est insuffisantes \n");
return(0);
}


Deuxieme code

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
#define MAX 50 
 
typedef struct Elem
		    {
		     int pid;
		     char file [40];
		     } Elem;
 
int cpt = 0;
 
Elem TElem [MAX];

Troisieme code

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include<string.h>
#include <sys/wait.h>
#include "tp.h"
 
int main (int argc, char** argv)
{
char c;
if (argc < 3 ) { 
		printf("Le nombre de paramètre est insuffisante \n");
		return (-1);               
		}
 
list_dir(argv[1],argv[2]);
 
return(0);
}
Quatrieme code

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#define MAX 50 
 
typedef struct Elem
		    {
		     int pid;
		     char file [40];
		     } Elem;
 
int cpt = 0;
 
Elem TElem [MAX];
 
 
int Exist_Elem ()
    {
     int i;
	  for(i = 0; i < cpt ; i++)  if (TElem[i].pid != 0)  return 1;
     return 0;	
    }
 
int Cher_Elem (pid_t y)
 
	{ int i;
	  for(i = 0; i < cpt ; i++)
		if (TElem[i].pid == y ) 
				{	
				 TElem[i].pid = 0;	  
				 return i ;
  			        } 
 
 	  return -1;	 
	}
 
int Add_Elem (char * x,pid_t y)
 
	{
	 if (cpt < MAX) 
			{ 
			  strcpy(TElem[cpt].file,x);
			  TElem[cpt].pid = y;
			  cpt++;
			  return(0);
			 }
  	 else return (-1); 
	}
 
Aff_Elem ()
 
	{ 
	  int i = 0;
	  for(; i < cpt; i++)	printf("### Le fils %d il a traité le fichier %s ### \n", TElem[i].pid, TElem[i].file);
	}
 
 
int child(char* dir,char* file, char* word)
	{
	  pid_t fils = fork();
	  if(fils == 0) 
			{
			  char path [50];
			  fprintf(stdout, "je suis le fils %d et j'ai traité le fichier  :%s/%s \n", getpid(), dir,file);
			  exit(0);
			}
	   else {
		 Add_Elem (file, fils); 
		}
	}
 
int  list_dir(char* argv1, char* argv2)
{
DIR *dir;
struct dirent *p;
char *fic = NULL; int nb = 0;
dir=opendir(argv1);
while((p = readdir(dir))!=NULL)
{
        fic = p->d_name;
	if (strcmp(fic,"..") && strcmp(fic,".") ) 
						  child(argv1, fic, argv2);
 
}
closedir(dir);
return 0;
}
Merci.