Probleme d'ouverture de fichier en C

Fermé
WeGe - Modifié par WeGe le 26/02/2011 à 14:33
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 - 27 févr. 2011 à 16:14
Bonjour,
je dois réaliser un producer-consumer à l'aide de bounded buffer et de semaphores.
Je dois identifier des mots (provenant d'un fichier dictionnaire) a des mots de passe d'archives. Je passe en argument à ma main le nom du fichier avec les mots et celui de l'archive dont je cherche le mdp.


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
#include <unistd.h>
#include "zip_crack.h"

#define SIZE_BUFFER 50
#define SIZE_LINE 50

sem_t full, empty, mutex;
char ** BB;
int counterBB;

void insertInBB(char * item){
strcpy(BB[counterBB],item);
counterBB++;
}

void removeInBB(char * item) {
item = BB[counterBB-1];
counterBB--;
}


void* producer(void *param){
FILE* fichier = fopen("dico.txt", "r");
char pwd[SIZE_LINE] = "";
if (fichier != NULL){
while(fgets(pwd, SIZE_LINE,fichier)!= NULL){
sem_wait(&empty);
sem_wait(&mutex);
insertInBB(pwd);
sem_post(&empty);
sem_post(&mutex);
}

fclose(fichier);

}
else
printf("Impossible d'ouvrir le fichier dico.txt");

pthread_exit((void *) 0);
}

void* consumer(void *param){
struct zip_archive * archive = param;
char pwd[SIZE_LINE] = "";

while(archive->found != 1){
sem_wait(&full);
sem_wait(&mutex);
removeInBB(pwd);
if(zip_test_password(archive, pwd) == 0) {
printf("Password is: %s\n", pwd);
archive->found = 1;
zip_close_archive(archive);
}
sem_post(&full);
sem_post(&mutex);
}
pthread_exit((void *) 0);
}

int main (int argc, char const * argv[]){
int j, k;
pthread_t p1, p2;
struct zip_archive * archive;
sem_init(&full, 0, 0);
sem_init(&empty, 0, SIZE_BUFFER);
sem_init(&mutex, 0, 1);
counterBB = 0;
BB = malloc(sizeof(char*)*SIZE_BUFFER);

for(j = 0; j< SIZE_BUFFER; j++){
BB[j] = malloc(sizeof(char) * (SIZE_LINE+1));
}


if ((archive = zip_load_archive(argv[2])) == NULL) {
printf("Unable to open archive %s\n", argv[2]);
return 2;
}

archive->found = 0;

pthread_create (&p1, NULL, producer, NULL);
pthread_create (&p2, NULL, consumer, archive);


pthread_join(p2, NULL);

for(k = 0; j< SIZE_BUFFER; k++){
free(BB[k]);
}
free(BB);
if(archive->found != 1)
printf("Password not found\n");

return 0;
}

Les fonctions relatives aux fichiers zip_crack.h sont toutes correctes.
On suppose que tous les mdps des archives sont dans le fichier dico.txt (qui contient les mots).
Cependant, à l'execution me voilà en face d'une erreur de segmentation.
Je sais que mon code est loin d'être optimisé, mais la seule chose qui m'importe dans un premier temps est de trouver où est-ce que j'ai généré une segmentation fault.
Si quelqu'un a une idée ...

A voir également:

1 réponse

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
Modifié par Hxyp le 27/02/2011 à 16:15
Bonjour,
Faites une vérification dans
void removeInBB(char * item) {
item = BB[counterBB-1];
counterBB--;
}
que counterBB ne soit pas à zéro avant de le décrémenter car ça risque de donner BB[-1] et à l'insertInBB ça poserait un problème "strcpy(BB[-1],item);", si j'ai bien compris comme c'est dans un thread il se lance 'en même temps' que le insertInBB pas de vérification à savoir si insertInBB a bien été utilisé avant le remove.. Enfin c'est là que je regarderai
0