2011-03-05 2 views
0

Je veux traverser le système de fichiers en utilisant des threads et des processus.Mon programme doit supposer que le premier paramètre est soit donné par "-p" propose une application multi-processus ou "-t" qui s'exécute de manière multithread. Le deuxième paramètre est le chemin d'accès d'un fichier ou d'un répertoire. Si mon programme obtient le chemin d'un fichier, il devrait imprimer la taille du fichier en octets. Si mon programme obtient le chemin d'un répertoire, il devrait, de la même façon, imprimer le nom du répertoire, puis traiter toutes les entrées du répertoire à l'exception du répertoire lui-même et du répertoire parent. Si mon programme reçoit un répertoire, il doit afficher toute la hiérarchie enracinée dans le répertoire spécifié. J'ai écrit quelque chose mais je me suis coincé dedans. Je ne peux pas améliorer mon code. Veuillez m'aider.Traverser le système de fichiers en fonction d'un emplacement racine donné en utilisant des threads en utilisant C pour unix

Mon code est le suivant:

comprennent

comprennent

comprennent

comprennent

comprennent

comprennent

comprennent

int funcThread (DIR * D); Int principal (int argc, char * argv []) { pthread_t thread [100]; DIR * dirPointer; struct stat fichier_objet; struct dirent * object_dir; int compteur;

if(opendir(argv[1])==NULL) 
{ 
    printf("\n\nERROR !\n\n Please enter -p or -t \n\n"); 
    return 0; 
} 

if((dirPointer=opendir(argv[1]))=="-t") 
{ 
    if ((object_dir = opendir(argv[2])) == NULL) 
     { 
       printf("\n\nERROR !\n\nPlease enter the third argument\n\n"); 
       return 0;. 
     } 
    else 
    { 
     counter=0; 
     while ((object_dir = readdir(object_dir)) != NULL) 
     { 
      pthread_create(&thread[counter],NULL,funcThread,(void *) object_dir); 
      counter++; 
     } 

    } 

} 

return 0; }

int funcThread (DIR * dptr) { DIR * ptr; struct stat oFile; struct dirent * oDir; int num;

if(ptr=readdir(dPtr)==NULL) 
    rewinddir(ptr); 

if(S_ISDIR(oFile.st_mode)) 
{ 
    ptr=readdir(dPtr); 
    printf("\t%s\n",ptr); 
    return funcThread(ptr); 
} 
else 
{ 
    while(ptr=readdir(dPtr)!=NULL) 
    { 
     printf("\n%s\n",oDir->d_name); 
     stat(oDir->d_name,&oFile); 
     printf("\n%f\n",oFile.st_size); 
    } 
    rewinddir(ptr); 
} 

}

Répondre

1

Cette ligne:

if((dirPointer=opendir(argv[1]))=="-t") 

dirPointer est un pointeur DIR * comment peut-il être égal à un pointeur de chaîne littérale?

0

J'ai repéré quelques erreurs:

  1. Pourquoi utilisez-vous opendir() pour vérifier vos arguments? Vous devriez utiliser quelque chose comme strcmp pour cela.

  2. Vous passez struct dirent * à funcThread() mais funcThread() prend un DIR *.

  3. Vous utilisez oFile sur funcThread() avant de l'initialiser (en appelant stat()).

  4. Quel est le rôle de l'appel de rewinddir()? Je suppose que vous essayez aveuglément d'obtenir readdir() pour travailler avec une struct dirent *.

  5. Vous utilisez oDir mais il n'est jamais initialisé.

  6. Vous appelez printf() à partir de plusieurs threads sans aucun moyen de synchroniser la sortie de sorte qu'elle soit complètement hors service ou brouillée.

Je vous suggère de lire et de comprendre la documentation de toutes ces fonctions avant de les utiliser (google « posix function_name ») et se familiariser avec les bases de C. Et avant de mettre des fils dans l'équation essayer de le faire fonctionner sur un seul programme fileté. De plus, vous ne verrez pas d'amélioration des performances si vous utilisez autant de threads, à moins que vous n'ayez presque autant de cœurs, cela diminuera les performances et augmentera l'utilisation des ressources.

Questions connexes