2016-07-23 1 views
-1

Je vais lire le fichier "comm" dans chaque répertoire de/proc. Mon programme peut voir la liste du répertoire, mais quand j'essaye d'ouvrir le dossier dans ce répertoire j'obtiens une erreur. Mon système est le matériel Debian Linux Beaglebone Black. J'apprends la programmation sous linux donc j'ai beaucoup de questions (parfois stupide).Impossible d'ouvrir les dossiers de l'emplacement/proc en C linux

liste de code:

#include <stdlib.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <dirent.h> 

#include <string.h> 
#include <fcntl.h> 

int main() 
{ 
    char path[50] = {0}; 
    register struct dirent *dirbuf; 
    char* dirname = "/proc"; 
    DIR *fdir; 

    fdir = opendir(dirname); 
    if (NULL == fdir) 
    { 
     printf("Can't open %s\n", dirname); 
     return; 
    } 

    while((dirbuf = readdir(fdir)) != NULL) 
    { 
     if ((strcmp(dirbuf->d_name, ".") == 0)||(strcmp(dirbuf->d_name, "..") == 0)) 
     { 
      continue; 
     } 

     printf("folder name: %s\n", dirbuf->d_name); 
     strcat(path, dirbuf->d_name); 
     strcat(path, "/comm"); 
     printf("path: %s\n", path); 

     int fd = open(path, O_RDONLY); 
     if (-1 == fd) 
     { 
      printf("Can't open file %s\n", path); 
     } 
     else 
     { 
      //read file 
      close(fd); 
     } 
     memset(path, 0, strlen(path) + 1); //clear path buffer 

    } 
    closedir(fdir); 
    return 0; 
} 

Connexion de la console linux:

enter image description here

+0

Lorsque cette fonction échoue, errno est défini. Ajouter #include et ajouter la valeur errno à l'impression, de cette façon vous savez pourquoi il a échoué –

Répondre

0

Vous devez utiliser le chemin complet pour ouvrir le fichier. c'est-à-dire: /proc/PID/comm au lieu de PID/comm.

Vous pouvez utiliser quelque chose comme ceci pour formater le chemin:

char* path[PATH_MAX]; 
snprintf(path, PATH_MAX, "/proc/%s/comm", dirbuf->d_name); 

Pour formater le chemin approprié.

+0

Merci! Encore une question. Comme dirbuf-> d_name n'a pas \ 0 (fin de chaîne), Shoul je dois ajouter \ 0 de la fin du chemin "/ proc /% s/comm" manuellement? – Nemo

+0

Désolé, j'ai trouvé que le chemin aura \ 0 par défaut. – Nemo

+0

Non, vous ne le faites pas. '' snprintf'' ajoute le '' \ 0'' pour vous. Voir '' man snprintf'' pour les détails – yadutaf