2016-05-23 9 views
0

特定のPIDのすべてのファイルディスクリプタの名前を出力する必要があります。私はproc/[pid]/fdにナビゲートするターミナルを介してアクセスする方法を知っていますが、私が得るのは色付きの数字だけです。私はls -lと書くことによって彼らの名前を得ることができます。LinuxのC言語のPIDからのファイルディスクリプタの印刷


私の質問は、私は私がstatを使用してみましたが、私はそれが仕事を得ることができなかった、そして私はg_dir_openを使用C.でこれらの名前を印刷することができる方法です。私は正しくglib.h"galloca.h not found in glib.h")を含めることができなかったので、うまくいきませんでした。

ありがとうございます。 ああ、私はLinuxに関しては完全なばかだと心に留めておいてください。

+3

*私はLinuxになると完全に馬鹿です。*あなたの研究と努力は、ちょっとしたことが分かります。あなたが試したことの[MCVE]を私たちに教えてください。 – t0mm13b

+0

'私はg_dir_open'を使いました:これは大丈夫ですか?:-) – sjsam

答えて

2

readdirreadlinkの組み合わせを使用すると、すべてのディスクリプタの絶対パスを取得できます。このサンプルでは、​​任意のpidを使用しています。コマンドライン引数として設定することも、関数を呼び出すこともできます。

#include <stdio.h> 
#include <fcntl.h> 
#include <limits.h> 
#include <string.h> 
#include <stdlib.h> 
#include <dirent.h> 
#include <unistd.h> 


int main(int argc, char *argv[]) 
{ 
    char *path = "/proc/3525/fd"; 
    DIR *fd_dir = opendir(path); 

    if (!fd_dir) { 
     perror("opendir"); 
     return 0; 
    } 

    struct dirent *cdir; 
    size_t fd_path_len = strlen(path) + 10; 
    char *fd_path = malloc(sizeof(char) * fd_path_len); 
    char *buf = malloc(sizeof(char) * PATH_MAX + 1); 

    while ((cdir = readdir(fd_dir))) { 
     if (strcmp(cdir->d_name, ".") == 0 || 
      strcmp(cdir->d_name, "..") == 0) 
      continue; 
     snprintf(fd_path, fd_path_len - 1, "%s/%s", path, cdir->d_name); 
     printf("Checking: %s\n", fd_path); 
     ssize_t link_size = readlink(fd_path, buf, PATH_MAX); 
     if (link_size < 0) 
      perror("readlink"); 
     else { 
      buf[link_size] = '\0'; 
      printf("%s\n", buf); 
     } 
     memset(fd_path, '0', fd_path_len); 
    } 

    closedir(fd_dir); 
    free(fd_path); 
    free(buf); 

    return 0; 
} 
+0

' while'ループの '.'と' ..'ディレクトリのエントリをスキップしたい場合は、 'readlink()'への失敗した呼び出しから 'EINVAL'エラーを生成します。 –

+0

@AndrewHenleあなたが正しいです、それは例を考慮に値するものです。 – tijko

+2

[readlink() '](http://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html)は、その文字列をヌル終端しないことに注意してください。結果の文字列ですが、読み取った文字の数は分かります。 (これは奇妙なデザインです!)だから、長さをキャプチャしてヌルバイト(しばしば最良の選択肢)をセットするか、 'printf("%。* s \ n " (int)numbytes、buf); '、あなたが' numbytes'で長さを捕捉したと仮定します。 –

関連する問題