Prog en c sous linux

Fermé
rafi oua Messages postés 30 Date d'inscription mercredi 23 décembre 2009 Statut Membre Dernière intervention 8 février 2013 - 14 nov. 2011 à 19:45
mamiemando Messages postés 33622 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 avril 2025 - 15 nov. 2011 à 20:03
Bonjour,
je souhaite supprimer des informer contenus dans un fichier txt à partir de c sous linux. Mes informations sont des numéros de 2 jusqu'à n. On utilise 2 processus parallèle.
je souhaite d'abord on utilise un processus p qui enregistre les nombres dans un fichier f puis crée un processus p1, celui-ci crée p2. ces 2 processus calcule les nombres premier.

le processus p coordonne les autre processus comme suit:
- il crée p1, celui-ci crée p2. ces 2 proces calculent a partir de f parallèlement et respectivement les nbrs divisible par 2 et par 3 (3 est le premier nombre premier déduit par p1, il est communique a p2 avant de réalise le rest de son travail) qu'il enregistre respectivement dans f1 et f2.
- P attend la fin de ce travail avant de mettre a jour f en éliminant tous les elts de f1 et f2.
- le travail est refaire en invoquant p1 et p2.
- p attend la fin de ce travail avant de mettre a jour f en éliminant tous les nombres de f1 et f2.

Ce travail est refaire jusqu'à atteindre racine de n processus (p,p1,p2,p,p1,p2,.............)
Voila mon programme

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

FILE *fichier,*fichier1,*fichier2;
int position=0;

void P2() // fils de p1

{ int i,c,id,k;

fichier = fopen("fichier.txt","r+");
//fichier1 = fopen("fichier1.txt","r+");
fichier2 = fopen("fichier2.txt","w+");


printf("\n--Execution du 2eme fils-- \n");
position=position+1;
// fscanf(Fichier,"%d\n",&k);
fseek(fichier,position,SEEK_SET);
fscanf(fichier,"%d",&k);
printf("les multiple de %d \n",k);
while (!feof(fichier));
{
fscanf(fichier,"%d\n",&c);
if (c % k == 0) {
fprintf(fichier2,"%d\n",c);
fscanf(fichier2,"%d",&c);
printf(" %d\n",c);}
}
fclose(fichier2);
//fclose(fichier1);
fclose(fichier);
exit(1);

}

void P1()//FIls
{
int a,c,id,k;
id = fork();
if (id == 0 ) P2();
else {
fichier = fopen("fichier.txt","r+");
fichier1 = fopen("fichier1.txt","w+");


printf("\n--Execution du 1er fils-- \n");
fseek(fichier,position,SEEK_SET);
fscanf(fichier,"%d",&k);
printf("les multiple de %d \n",k);
while (!feof(fichier))
{
fscanf(fichier,"%d\n",&c);
if (c % k == 0) {
fprintf(fichier1,"%d\n",c);
fscanf(fichier1,"%d",&c);
printf(" %d \n",c);
}
}
fclose(fichier);
fclose(fichier1);
}
wait(0);
exit(0);
}

int main ()
{
FILE *fich;
int i, n,a,c,b, id, nbr=2;

//Creer et remplir le fichier
printf("donner le nombre n \n");
scanf ("%d",&n);
fichier=fopen("fichier.txt","w+");
printf (" les elements de fichier \n");
for (i=2; i<=n; i++)
{ fprintf(fichier, "%d \n", i);
printf (" %d \n",i);
}
fclose(fichier);


//creer et remplir le fichier1 et le fichier2
float r=sqrt(n);
int rr= (int) r;
while /*(nbr*nbr <= n)*/(nbr <= rr)
{
id= fork();
if (id==0) P1();
else wait (0);

//mise a jour de fichier
fichier = fopen("fichier.txt","r");
fichier1 = fopen("fichier1.txt","r");
fichier2 = fopen("fichier2.txt","r");
fich = fopen("fich.txt","w");

while (!feof(fichier1) && !feof(fichier2))
{
fscanf(fichier1,"%d",&a);
fscanf(fichier2,"%d",&c);

// printf("a:%d\n c:%d\n",a,c);
while(!feof(fichier))
{
fscanf(fichier,"%d",&b);
// printf("b:%d\n",b);
if ((a != b) && (c != b))
{
printf("bb les elts de fich:%d\n",b);
fprintf(fich,"%d\n",b);
fscanf(fich,"%d",&b);
printf(" %d \n",b);
}
}
}
fclose(fichier); fclose(fich);
remove ("fichier.txt");
rename ("fichier.txt","fich.txt");

position = position +2;
nbr++;

fseek(fichier,position,SEEK_SET);

}
}

d'avance merci de votre aide.


A voir également:

1 réponse

mamiemando Messages postés 33622 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 avril 2025 7 839
Modifié par mamiemando le 15/11/2011 à 10:24
Et quelle est la question ?

Quelques conseils préliminaires :

- corrige les warning : notamment main est sensée retourner un entier (0 si tout va bien)
- attention à la manière dont tu gères les fichiers et à contrôler que ce que tu crées/ouvres est fait avec succès. Par exemple l'ouverture d'un fichier se gère par exemple comme suit :

FILE *fp;   
const char *filename = "toto.txt";   
fp = fopen(filename, "r");   

if (fp) {   
  // traiter le fichier ...   
  fclose(fp);   
} else {   
  fprintf(stderr, "%s: can' read %s\n", argv[0], filename); 
  // Pas de fclose, car le fichier n'a pas été ouvert 
  return 1;   
}


- "position = position +2;" s'écrit plus simplement "position += 2;"

- Évite les exit violent, car tu ne garantis pas que ce que tu as ouvert à été fermé. Tu peux par exemple repasser par une fonction du genre :

void quitter_proprement(){   
   if(fichier) fclose(fichier);   
   if(fichier1) fclose(fichier1);   
   if(fichier2) fclose(fichier2);   
}


- Évite les variables globales, ce n'est pas une bonne habitude de programmation. Ce qui signifie que tu dois passer en paramètre fichier, fichier1, fichier2 en paramètre des fonctions qui en ont besoin. Typiquement :

void quitter_proprement(FILE *fichier, FILE *fichier1, FILE *fichier2){   
   if(fichier) fclose(fichier);   
   if(fichier1) fclose(fichier1);   
   if(fichier2) fclose(fichier2);   
}


- Sauf erreur de ma part, je ne crois pas que tu aies besoin d'inclure <math.h> (et de lier ton programme à la librairie mathématique)

Bonne chance
0
rafi oua Messages postés 30 Date d'inscription mercredi 23 décembre 2009 Statut Membre Dernière intervention 8 février 2013
15 nov. 2011 à 18:27
Salut,
Je vous remercier pour votre conseils et votre aide, mais mon problème c que dans l'exécution de mon programme les processus ne sont pas en parallèle et mon but c le parallélisme et comment je peut communique processus 1 avec processus 2 sans utilisation des signaux (3 est le premier nombre premier déduit par p1, il est communique a p2 avant de réalise le reste de son travail)..
merci
0
mamiemando Messages postés 33622 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 7 avril 2025 7 839
15 nov. 2011 à 20:03
Avec pipe et pipe2 ?

man 2 pipe
man 2 pipe2
0