2016-07-23 2 views
-1

私は/ procの各ディレクトリで "comm"ファイルを読むつもりです。私のプログラムはディレクトリのリストを見ることができますが、このディレクトリにあるフォルダを開こうとするとエラーになります。私のシステムはDebian LinuxのハードウェアBeaglebone Blackです。私はLinux上でプログラミングを学んでいるので、たくさんの質問がある(時にはばかな)。コードのCのLinuxの/ procの場所からフォルダを開くことができません

リスト:

#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; 
} 

Linuxコンソールからログイン:

enter image description here

+0

この関数が失敗すると、errnoが設定されます。 #include を追加して、errnoの値をプリントに追加します。この方法で、失敗した理由を知ることができます。 –

答えて

0

あなたがファイルを開くために、完全なパスを使用する必要があります。すなわち、PID/commの代わりに/proc/PID/commです。

あなたは、パスをフォーマットするために、このようなものを使用することができます。

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

パスを適切にフォーマットします。

+0

ありがとう!もう1つの質問。 dirbuf-> d_nameに\ 0(文字列の終わり)がないので、Shoul "/ proc /%s/comm"パスの末尾に\ 0を手動で追加する必要がありますか? – Nemo

+0

申し訳ありませんが、デフォルトでパスに\ 0があることがわかりました。 – Nemo

+0

いいえ。 '' snprintf''はあなたのために '' \ 0''を追加します。詳細は '' man snprintf''を参照してください – yadutaf

関連する問題