Utilisation d'un fork
tfcv123
Messages postés
75
Statut
Membre
-
chuka Messages postés 980 Statut Membre -
chuka Messages postés 980 Statut Membre -
Bonjour,
j'ai un pbm avec mon programme qui me permet d'executer des fichiers .c entrée en argument. le pbm est kil compile le premier fichier mais pas le deuxieme d'ou le message
// le nombre d'argument est 3
voici les fichiers a compiler:
exo1.c
//
comment faire pour kil m'exécute le deuxième fichier et me l'affiche.aidez moi SVP, c'est très urgent
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include <sys/wait.h>
int main(int argc, char**argv)
{
int i=1;
int j;
printf("le nombre d'argument est %d\n",argc);
if(argc==1)//teste si il y a des fichiers en entrée
{
printf("************ pas de fichier en entree ***********\n");
}
else
//for(i=1; i<=argc; i++){
printf("voici les fichiers a compiler:\n");
while(i<argc)
i++;
printf("%s\n",argv[i]);//affiche les fichiers i a compiler
if(fopen(argv[i],"r")==NULL)//teste l'existance du fichier
{
printf("*****Le fichier %s est inexistant********\n",argv[i]);
}
else//le fichier existe
{
j=execlp("gcc","gcc","-c",argv[i],NULL);//aprés l'execution de execlp => fin du fils
if(j==-1)//il y a une erreure
{
switch(errno)//variable contenant le code d'erreur
{
case(ENOENT): printf("*****Le compilateur n'est pas present*****\n");
break;
//case(E_COMPILE_ERROR): printf("********Erreur de compilation*******\n");
//break;
}
}
else//aucune erreur
{
printf("ce fichier a bien ete compile\n");
}
}
return 0;
}
j'ai un pbm avec mon programme qui me permet d'executer des fichiers .c entrée en argument. le pbm est kil compile le premier fichier mais pas le deuxieme d'ou le message
// le nombre d'argument est 3
voici les fichiers a compiler:
exo1.c
//
comment faire pour kil m'exécute le deuxième fichier et me l'affiche.aidez moi SVP, c'est très urgent
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include <sys/wait.h>
int main(int argc, char**argv)
{
int i=1;
int j;
printf("le nombre d'argument est %d\n",argc);
if(argc==1)//teste si il y a des fichiers en entrée
{
printf("************ pas de fichier en entree ***********\n");
}
else
//for(i=1; i<=argc; i++){
printf("voici les fichiers a compiler:\n");
while(i<argc)
i++;
printf("%s\n",argv[i]);//affiche les fichiers i a compiler
if(fopen(argv[i],"r")==NULL)//teste l'existance du fichier
{
printf("*****Le fichier %s est inexistant********\n",argv[i]);
}
else//le fichier existe
{
j=execlp("gcc","gcc","-c",argv[i],NULL);//aprés l'execution de execlp => fin du fils
if(j==-1)//il y a une erreure
{
switch(errno)//variable contenant le code d'erreur
{
case(ENOENT): printf("*****Le compilateur n'est pas present*****\n");
break;
//case(E_COMPILE_ERROR): printf("********Erreur de compilation*******\n");
//break;
}
}
else//aucune erreur
{
printf("ce fichier a bien ete compile\n");
}
}
return 0;
}
A voir également:
- Utilisation d'un fork
- Utilisation chromecast - Guide
- Télécharger gratuitement notice d'utilisation - Guide
- La ressource demandée est en cours d'utilisation ✓ - Forum Logiciels
- Imprimante en cours d'utilisation ✓ - Forum Matériel & Système
- Dossier en cours d'utilisation supprimer - Guide
7 réponses
salut,
while(i<argc)
{i++;
printf("%s\n",argv[i]);//affiche les fichiers i a compiler
}
si tu met pas les accolade, il fait que i++.....
@+
while(i<argc)
{i++;
printf("%s\n",argv[i]);//affiche les fichiers i a compiler
}
si tu met pas les accolade, il fait que i++.....
@+
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
int main(int argc, char**argv)
{
int i=1;
int j;
printf("le nombre d'argument est %d\n",argc);
if(argc==1)//teste si il y a des fichiers en entrée
{
printf("************ pas de fichier en entree ***********\n");
return -1;
}
while(i<argc)
{
printf("%s\n",argv[i]);//affiche le fichier i a compiler
if(fopen(argv[i],"r")==NULL)//teste l'existance du fichier
printf("*****Le fichier %s est inexistant********\n",argv[i]);
else//le fichier existe
{
j=execlp("gcc","gcc","-c",argv[i],NULL);//aprés l'execution de execlp => fin du fils
if(j==-1)//il y a une erreure
{
switch(errno)//variable contenant le code d'erreur
{
case(ENOENT): printf("*****Le compilateur n'est pas present*****\n");
break;
//case(E_COMPILE_ERROR): printf("********Erreur de compilation*******\n");
//break;
}
}
else//aucune erreur
printf("ce fichier a bien ete compile\n");
}
i++;
}
getchar();
return 1;
}
j'ai testé cela... chez moi ca marche...
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
int main(int argc, char**argv)
{
int i=1;
int j;
printf("le nombre d'argument est %d\n",argc);
if(argc==1)//teste si il y a des fichiers en entrée
{
printf("************ pas de fichier en entree ***********\n");
return -1;
}
while(i<argc)
{
printf("%s\n",argv[i]);//affiche le fichier i a compiler
if(fopen(argv[i],"r")==NULL)//teste l'existance du fichier
printf("*****Le fichier %s est inexistant********\n",argv[i]);
else//le fichier existe
{pid_t t=fork();//creation du processus fils
if (t==0) //si c'est le fils
{j=execlp("gcc","gcc","-c",argv[i],NULL);//execution de execlp par le fils
exit(-1);//fin du processus fils
}
else
{wait(0); //si c'est le pere il attend la fin du processus fils
if(j==-1) //il y a une erreure
{ switch(errno)//variable contenant le code d'erreur
{
case(ENOENT): printf("*****Le compilateur n'est pas present*****\n");
break;
//case(E_COMPILE_ERROR): printf("********Erreur de compilation*******\n");
//break;
}
}
else printf("*****Le fichier %s est BIEN COMPILÉ********\n",argv[i]);
}
}
i++;
}
getchar();
return 1;
}
essaie cela...
Merci, ça marche mais j'aimerais refaire le mm programme mais en créant un thread par fichier entrer en argument et chaque thread compile le fichier :
j'ai fait ce programme mais je pense que je me suis mélangre les pinceaux,je ne comprends plus rien. Aide moi s'il te plait:
Voici le programme
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<errno.h>
pthread_t pthread_id[8];
int j,k,l;
void *f (void *param)
{
int j=0,k=0,l=0;
//printf("DEBUT THREAD\n");
for(j=0;j<3;j++)
{
for(k=0;k<100000000;k++)
{
l=k/(j+1);
}
//printf("l=%d\n",l);
}
//printf("FIN THREAD\n");
pthread_exit(NULL);
}
int main(int argc, char**argv)
{
int i=1;
int j;
printf("le nombre d'argument est %d\n",argc);
if(argc==1)//teste s'il y a des fichiers en entrée
{
printf("************ pas de fichier en entree ***********\n");
}
else
{
printf("%s\n",argv[i]);
//printf("voici les fichiers a compiler:%s\n");
for (i=1;i<=argc;i++)//
{
for(i=0;i<8;i++)
{
if(pthread_create(pthread_id+i,NULL,f,NULL)==-1)
{
perror("pthread_create");
exit(2);
}
}
for(i=0;i<argc;i++)
{
//printf("attente\n");
if(pthread_join(pthread_id[i],NULL)!=0) //synchronisation des threads
{
perror("pthread_join");
exit(-1);
}
}
}
if(fopen(argv[i],"r")==NULL)//teste l'existance du fichier
{
printf("*****Le fichier %s est inexistant********\n",argv[i]);
}
else//le fichier existe
{
j=execlp("gcc","gcc","-c",argv[i],NULL);//aprés l'execution de execlp => fin du fils
if(j==-1)//il y a une erreure
{
switch(errno)//variable contenant le code d'erreur
{
case(ENOENT): printf("*****Le compilateur n'est pas present*****\n");
break;
}
}
else//aucune erreur
{
printf("ce fichier a bien ete compile\n");
}
}
//i++;
//}
//}
return 0;
}
}
j'ai fait ce programme mais je pense que je me suis mélangre les pinceaux,je ne comprends plus rien. Aide moi s'il te plait:
Voici le programme
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<errno.h>
pthread_t pthread_id[8];
int j,k,l;
void *f (void *param)
{
int j=0,k=0,l=0;
//printf("DEBUT THREAD\n");
for(j=0;j<3;j++)
{
for(k=0;k<100000000;k++)
{
l=k/(j+1);
}
//printf("l=%d\n",l);
}
//printf("FIN THREAD\n");
pthread_exit(NULL);
}
int main(int argc, char**argv)
{
int i=1;
int j;
printf("le nombre d'argument est %d\n",argc);
if(argc==1)//teste s'il y a des fichiers en entrée
{
printf("************ pas de fichier en entree ***********\n");
}
else
{
printf("%s\n",argv[i]);
//printf("voici les fichiers a compiler:%s\n");
for (i=1;i<=argc;i++)//
{
for(i=0;i<8;i++)
{
if(pthread_create(pthread_id+i,NULL,f,NULL)==-1)
{
perror("pthread_create");
exit(2);
}
}
for(i=0;i<argc;i++)
{
//printf("attente\n");
if(pthread_join(pthread_id[i],NULL)!=0) //synchronisation des threads
{
perror("pthread_join");
exit(-1);
}
}
}
if(fopen(argv[i],"r")==NULL)//teste l'existance du fichier
{
printf("*****Le fichier %s est inexistant********\n",argv[i]);
}
else//le fichier existe
{
j=execlp("gcc","gcc","-c",argv[i],NULL);//aprés l'execution de execlp => fin du fils
if(j==-1)//il y a une erreure
{
switch(errno)//variable contenant le code d'erreur
{
case(ENOENT): printf("*****Le compilateur n'est pas present*****\n");
break;
}
}
else//aucune erreur
{
printf("ce fichier a bien ete compile\n");
}
}
//i++;
//}
//}
return 0;
}
}
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include <pthread.h>
void my_thread(char*m)
{int j;
pid_t t=fork();
if (t==0)
{j=execlp("gcc","gcc","-c",m,NULL);
exit (-1);
}
else
{wait(0);
if(j==-1)
{ switch(errno)//variable contenant le code d'err
{
case(ENOENT): printf("*****Le compilateur n'est pas present*****\n");
break;
//case(E_COMPILE_ERROR): printf("********Erreur de compilation*******\n");
//break;
}
}
else printf("*****Le fichier %s est BIEN COMPILÉ********\n",m);
}
pthread_exit(0);
}
int main(int argc, char**argv)
{
int i=1;
int j;
void*ret;
pthread_t t[argc];
printf("le nombre d'argument est %d\n",argc);
if(argc==1)//teste si il y a des fichiers en entrée
{
printf("************ pas de fichier en entree ***********\n");
return -1;
}
while(i<argc)
{
printf("%s\n",argv[i]);//affiche le fichier i a compiler
if(fopen(argv[i],"r")==NULL)//teste l'existance du fichier
printf("*****Le fichier %s est inexistant********\n",argv[i]);
else pthread_create(&t[i],NULL,my_thread,(char*)argv[i]);
pthread_join(t[i],&ret);
i++;
}
getchar();
return 1;
}
Ca fonctionne sur mon PC...mais le but c'est que tu comprennes le code!! donc hésite pas si tu as des question sur celui-ci!!
@+
Merci,
ca marche mais Grace à toi j'ai pu comrendre cetet partie du cours qui est dur pour moi.
Mais je ne comprends pas cette partie
pid_t t=fork();
if (t==0)
mais comment pourais je faire si je voulais initialiser un ensemble de taile fixe de threads, avoir un tableau qui sert de zone mémoire partagée entre mon programme principal et les threads. pour cela ,il faut utiliser le mécanisme de producteur consommateur pour compiler les fichier. chaque fichier est mis dans le tableau, chaque thread consomme un entrée du tableau en compilant le fichier concerné.
merci
ca marche mais Grace à toi j'ai pu comrendre cetet partie du cours qui est dur pour moi.
Mais je ne comprends pas cette partie
pid_t t=fork();
if (t==0)
mais comment pourais je faire si je voulais initialiser un ensemble de taile fixe de threads, avoir un tableau qui sert de zone mémoire partagée entre mon programme principal et les threads. pour cela ,il faut utiliser le mécanisme de producteur consommateur pour compiler les fichier. chaque fichier est mis dans le tableau, chaque thread consomme un entrée du tableau en compilant le fichier concerné.
merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut
quand tu fais un fork(), tu divises en fait ton programme en 2.
le processus père et le processus fils.
Il faut donc déterminer dans ton code à quel processus le code qui suit est à effectuer: le pere ou le fils.
Quand tu fais:
pid_t t=fork();
if (t==0)
tu divises donc ton code en 2 processus et donc si le pid=0 le code est à faire par le fils, le père ne l'effectuera pas!
Pour les thread, c'est un peu le même principe sauf qu'aux niveau des données, ils ont tous les même données du programmes (contrairement au processus où il y a une copie des données du processus pere vers le fils et les nouvelles données créer par la suite sont indépendantes)
Concernant ton prb,pas la peine de mettre de mutex car tous les fichiers sont différents (donc zone mémoire différentes) mais si tu devais utiliser un même fichier pour compiler (gcc -c nom_du_fichier) et un autre thread pour effacer le fichier par exemple, il faudrait protéger la ressource par un mutex, car que ce passe-t-il si tu es en train de compiler et que le thread arrive pour effacer....
C'est un peu subtile mais avec un peu d'entrainement, tout s'éclairera!!
@+
quand tu fais un fork(), tu divises en fait ton programme en 2.
le processus père et le processus fils.
Il faut donc déterminer dans ton code à quel processus le code qui suit est à effectuer: le pere ou le fils.
Quand tu fais:
pid_t t=fork();
if (t==0)
tu divises donc ton code en 2 processus et donc si le pid=0 le code est à faire par le fils, le père ne l'effectuera pas!
Pour les thread, c'est un peu le même principe sauf qu'aux niveau des données, ils ont tous les même données du programmes (contrairement au processus où il y a une copie des données du processus pere vers le fils et les nouvelles données créer par la suite sont indépendantes)
Concernant ton prb,pas la peine de mettre de mutex car tous les fichiers sont différents (donc zone mémoire différentes) mais si tu devais utiliser un même fichier pour compiler (gcc -c nom_du_fichier) et un autre thread pour effacer le fichier par exemple, il faudrait protéger la ressource par un mutex, car que ce passe-t-il si tu es en train de compiler et que le thread arrive pour effacer....
C'est un peu subtile mais avec un peu d'entrainement, tout s'éclairera!!
@+
oui, j'ai pu resoudre le problème mais la je swi confronté à ce pbm voici ce ke j'ai éssayé de faire :
mais il ya des erreurs. j'ai envi de garder les mm messages.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>
//NBTHREADr de pthread cree
# define NBTHREAD 3
//taille du tableau
# define TAILLEMAX 4
pthread_t *pthread_id;
sem_t placeDispo;//sem_t placeDisponible
sem_t infoDispo;//sem_t infoDisponible
sem_t mutex;
sem_t S;
/*Declaration du tableau T en variable globale qui contiendra les noms des fichiers passés en argument*/
char *T[TAILLEMAX];
/* la fonction appellé par les threads qui va compiler les fichiers*/
void execut(int i);//compilation
/*La fonction main va crée les threads et aussi ranger dans le tableau les
noms des fichiers passés en argument.Le main c'est le producteur
d'information (il range dans le tableau les arguments)*/
int main(int argc,char* argv[])
{
/*Initialisation des variables et des semaphores*/
int i,j,p=1;
sem_init(&placeDispo,0,TAILLEMAX);
sem_init(&infoDispo,0,0);
sem_init(&mutex,0,1);
sem_init(&S,0,0);
/*allocation memoire du tableau T */
for(i=0;i<TAILLEMAX;i++)
{
T[i] = malloc(sizeof(char*));
}
/*Verification si l'utilisateur a bien donné le bon nombre d'arguments*/
printf("le nombre d'argument est %d\n\n",argc-1);
if(argc==1)//teste s'il y a des fichiers en entrée
{
printf("pas de fichier en entree \n");
return -1;
}
while(p<argc)
{
printf("Le fichier à compiler est: %s\n",argv[p]);//affiche le fichier i a compiler
if(fopen(argv[p],"r")==NULL)//teste l'existance du fichier
printf("Le fichier %s est inexistant\n\n",argv[p]);
else
{
/*allocation memoire des threads*/
pthread_id = malloc((NBTHREAD)*sizeof(pthread_t));
/*creation des threads*/
for(i=0;i<NBTHREAD;i++)
{
if (pthread_create(pthread_id+i,NULL,(void*)execut,(void*)i)==-1)
{
fprintf(stderr,"Erreur de creation pthread numero %d ",i);
exit(-2);
}
}
/*tant que on a des fichiers a compiler on les ajoutes dans le tableau T a
condition que il y a de la place dans le tableau.Cette condition est verifié par le semaphore
placeDispo.On copie dans un espace vide du tableau le nom du fichier a compiler.
Puisque le tableau contient des données , on va incrementer le semaphore infoDispo*/
for(i=1;i<argc;i++)
{
sem_wait(&placeDispo);
for(j=0;j<TAILLEMAX;j++)
{
if (strlen(T[j])==0)
{
strcpy(T[j],argv[i]);
j=TAILLEMAX;
}
}
sem_post(&infoDispo);
}
/*Pour savoir si on a bien compiler tous les fichiers données en argument,on va decrementer S jusqu'a
ce que on fait argc-1 fois la boucle.si S < (argc-1) , alors on a un thread qui est entrain de compiler
un fichier*/
for(i=1;i<argc;i++)
{
sem_wait(&S);
}
for(i=0;i<TAILLEMAX;i++)
{
free(T[i]);
}
free(pthread_id);
}
}
return 0;
}
/*Compilation des fichiers par les threads*/
void execut(int k)
{
char *fic;
int i;
int pid;
/*allocation memoire de fic*/
fic = malloc(sizeof(char*));
while(1)
{
/*On boucle jusqu'a ce que on a des fichiers dans le tableau T*/
sem_wait(&infoDispo);
/* On prend un nom de fichier dans le tableau et on la copie dans fic */
for(i=0;i<TAILLEMAX;i++)
{
if (strlen(T[i])!=0)
{
sem_wait(&mutex);
strcpy(fic,T[i]);
strcpy(T[i],"\0");
i=TAILLEMAX;
sem_post(&mutex);
}
}
/*une fois qu'on a effacer le nom du fichier dans le Tableau on incremente le
nombre de place disponible pour permettre l'ajout d'un nouveau fichier*/
sem_post(&placeDispo);
/*creation d'un processus*/
pid = fork();
/*compilation du fichier qui se trouve dans fic*/
if (pid==0)
{
if(execlp("gcc", "gcc", fic, "-c", NULL) == -1)
{
perror("Erreur de compilation");
exit(-1);
}
}
/*on attend la fin du fils*/
wait(&pid);
printf("compilation par le thread %d du fichier %s \n",k,fic);
/*Incrementation de S pour signifier qu'on a compiler 1 fichier de plus*/
sem_post(&S);
}
}
mais il ya des erreurs. j'ai envi de garder les mm messages.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>
//NBTHREADr de pthread cree
# define NBTHREAD 3
//taille du tableau
# define TAILLEMAX 4
pthread_t *pthread_id;
sem_t placeDispo;//sem_t placeDisponible
sem_t infoDispo;//sem_t infoDisponible
sem_t mutex;
sem_t S;
/*Declaration du tableau T en variable globale qui contiendra les noms des fichiers passés en argument*/
char *T[TAILLEMAX];
/* la fonction appellé par les threads qui va compiler les fichiers*/
void execut(int i);//compilation
/*La fonction main va crée les threads et aussi ranger dans le tableau les
noms des fichiers passés en argument.Le main c'est le producteur
d'information (il range dans le tableau les arguments)*/
int main(int argc,char* argv[])
{
/*Initialisation des variables et des semaphores*/
int i,j,p=1;
sem_init(&placeDispo,0,TAILLEMAX);
sem_init(&infoDispo,0,0);
sem_init(&mutex,0,1);
sem_init(&S,0,0);
/*allocation memoire du tableau T */
for(i=0;i<TAILLEMAX;i++)
{
T[i] = malloc(sizeof(char*));
}
/*Verification si l'utilisateur a bien donné le bon nombre d'arguments*/
printf("le nombre d'argument est %d\n\n",argc-1);
if(argc==1)//teste s'il y a des fichiers en entrée
{
printf("pas de fichier en entree \n");
return -1;
}
while(p<argc)
{
printf("Le fichier à compiler est: %s\n",argv[p]);//affiche le fichier i a compiler
if(fopen(argv[p],"r")==NULL)//teste l'existance du fichier
printf("Le fichier %s est inexistant\n\n",argv[p]);
else
{
/*allocation memoire des threads*/
pthread_id = malloc((NBTHREAD)*sizeof(pthread_t));
/*creation des threads*/
for(i=0;i<NBTHREAD;i++)
{
if (pthread_create(pthread_id+i,NULL,(void*)execut,(void*)i)==-1)
{
fprintf(stderr,"Erreur de creation pthread numero %d ",i);
exit(-2);
}
}
/*tant que on a des fichiers a compiler on les ajoutes dans le tableau T a
condition que il y a de la place dans le tableau.Cette condition est verifié par le semaphore
placeDispo.On copie dans un espace vide du tableau le nom du fichier a compiler.
Puisque le tableau contient des données , on va incrementer le semaphore infoDispo*/
for(i=1;i<argc;i++)
{
sem_wait(&placeDispo);
for(j=0;j<TAILLEMAX;j++)
{
if (strlen(T[j])==0)
{
strcpy(T[j],argv[i]);
j=TAILLEMAX;
}
}
sem_post(&infoDispo);
}
/*Pour savoir si on a bien compiler tous les fichiers données en argument,on va decrementer S jusqu'a
ce que on fait argc-1 fois la boucle.si S < (argc-1) , alors on a un thread qui est entrain de compiler
un fichier*/
for(i=1;i<argc;i++)
{
sem_wait(&S);
}
for(i=0;i<TAILLEMAX;i++)
{
free(T[i]);
}
free(pthread_id);
}
}
return 0;
}
/*Compilation des fichiers par les threads*/
void execut(int k)
{
char *fic;
int i;
int pid;
/*allocation memoire de fic*/
fic = malloc(sizeof(char*));
while(1)
{
/*On boucle jusqu'a ce que on a des fichiers dans le tableau T*/
sem_wait(&infoDispo);
/* On prend un nom de fichier dans le tableau et on la copie dans fic */
for(i=0;i<TAILLEMAX;i++)
{
if (strlen(T[i])!=0)
{
sem_wait(&mutex);
strcpy(fic,T[i]);
strcpy(T[i],"\0");
i=TAILLEMAX;
sem_post(&mutex);
}
}
/*une fois qu'on a effacer le nom du fichier dans le Tableau on incremente le
nombre de place disponible pour permettre l'ajout d'un nouveau fichier*/
sem_post(&placeDispo);
/*creation d'un processus*/
pid = fork();
/*compilation du fichier qui se trouve dans fic*/
if (pid==0)
{
if(execlp("gcc", "gcc", fic, "-c", NULL) == -1)
{
perror("Erreur de compilation");
exit(-1);
}
}
/*on attend la fin du fils*/
wait(&pid);
printf("compilation par le thread %d du fichier %s \n",k,fic);
/*Incrementation de S pour signifier qu'on a compiler 1 fichier de plus*/
sem_post(&S);
}
}
Salut,
Suis pas sur d'avoir tout compris:
Tu souhaites creer un tableau avec autant de thread que de fichier à compiler et que le processus principal range les noms des fichiers dans un tableau où les threads viendront recuperer les fichiers à compiler?
Suis pas sur d'avoir tout compris:
Tu souhaites creer un tableau avec autant de thread que de fichier à compiler et que le processus principal range les noms des fichiers dans un tableau où les threads viendront recuperer les fichiers à compiler?
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>
# define NBTHREAD 3
# define TAILLEMAX 4
//code fonctionne avec les mutex ou semaphore
//sem_t * mon_sem;
pthread_mutex_t mon_mutex; //declaration de mon mutex
void* execut(void*);//declaration de la fonction à efectuer par le thread qui effectue la compilation
void* executr(char**);//declaration de la fonction du thread qui effectue le remplissage du tableau
char* tab[TAILLEMAX];//tableau partagé qui va etre rempli des arguments
int t,dr;
int main(int argc,char* argv[])
{
//mon_sem=(sem_t*)malloc(sizeof(sem_t));
//sem_init(mon_sem,0,1);
//sem_getvalue(mon_sem,&pr);
pthread_mutex_init(&mon_mutex,NULL);//init de mon mutex
pthread_t pthread_id;
pthread_t pthread_id1;
void* ret;
int i,j,p=1;
printf("le nombre d'argument est %d\n\n",argc-1);
if(argc==1)//teste s'il y a des fichiers en entrée
{
printf("pas de fichier en entree \n");
return -1;
}
t=0; //compteur du nombre de fichier qui existe et qu'il faudra compiler
while(p<argc)
{
printf("Le fichier à compiler est: %s\n",argv[p]);//affiche le fichier i a compiler
if(fopen(argv[p],"r")==NULL)//teste l'existance du fichier
printf("Le fichier %s est inexistant\n\n",argv[p]);
else t++;//normalement ici on devrait creer un tableau de char* pour enregistrer tous les elements à compiler //veritablement
p++;
}
//creation des 2 threads
if (pthread_create(&pthread_id,NULL,(void *)execut,NULL)==-1)
{
fprintf(stderr,"Erreur de creation pthread numero %d ",t);
exit(-2);
}
if (pthread_create(&pthread_id1,NULL,(void *)executr,(char **)argv)==-1)
{
fprintf(stderr,"Erreur de creation pthread numero %d ",t);
exit(-2);
}
//sem_destroy(mon_sem);
pthread_join(pthread_id,&ret);
pthread_join(pthread_id1,&ret);
getchar();
return 1;
}
void* execut(void * ar)
{char *fichier=(char*)malloc(20*sizeof(char));//variable qui recupere le nom du fichier, mais variable pas //indispensable
int pid;
for(;;) //boucle de mon thread
{printf("%s \n",tab[t]);
if(tab[t]!=NULL )
{pthread_mutex_lock(&mon_mutex);
//sem_wait(mon_sem);
fichier=tab[t];
pid = fork();
if (pid==0)
{
if(execlp("gcc", "gcc", fichier, "-c", NULL) == -1)
{
perror("Erreur de compilation");
exit(-1);
}
}
wait(0);
printf("compilation par le thread du fichier %s\n",fichier);
t++;
//sem_post(mon_sem);
pthread_mutex_unlock(&mon_mutex);
}
if (t==4) break;
sleep(1);
}
pthread_exit(0);
}
void* executr(char**ar)
{sleep(3);
//sem_wait(mon_sem);
pthread_mutex_lock(&mon_mutex);
while (t>0)
{tab[t]=ar[t];
printf("on est dans le thread du tableau %s et t vaut %d \n",tab,t);
t--;
sleep(2);
}
t++;
//sem_post(mon_sem);
pthread_mutex_unlock(&mon_mutex);
pr=2;
pthread_exit(0);
}
Je t'ai laissé les sleep() pour voir la synchro des 2 threads...
Je suis pas sur que cela reponde à ton précédent post mais, ca pourra peut-etre t'aider!!
@+
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
int main(int argc, char**argv)
{
int i=1;
int j;
printf("le nombre d'argument est %d\n",argc);
if(argc==1)//teste si il y a des fichiers en entrée
{
printf("************ pas de fichier en entree ***********\n");
}
else
{
for (i=1;1<=argc;i++)
{
printf("voici les fichiers a compiler:\n");
while(i<=argc)
{
printf("%s\n",argv[i]);//affiche le fichier i a compiler
if(fopen(argv[i],"r")==NULL)//teste l'existance du fichier
{
printf("*****Le fichier %s est inexistant********\n",argv[i]);
i++;
}
else//le fichier existe
{
j=execlp("gcc","gcc","-c",argv[i],NULL);//aprés l'execution de execlp => fin du fils
if(j==-0)//il y a une erreure
{
switch(errno)//variable contenant le code d'erreur
{
case(ENOENT): printf("*****Le compilateur n'est pas present*****\n");
break;
//case(E_COMPILE_ERROR): printf("********Erreur de compilation*******\n");
//break;
}
}
else//aucune erreur
{
printf("ce fichier a bien ete compile\n");
}
i++;
}
}
}
}
return 0;
}