2011-11-17 7 views

答えて

6

特定のシステム(下記参照)では、/ proc/[pid]/fdで数えられます。そのうちの1つに該当しない場合は、wallyk's answerを参照してください。 C言語で

、あなたはディレクトリの一覧を表示し、合計を数え、またはディレクトリの内容一覧表示することができます。bashで

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

int 
main (void) 
{ 
    DIR *dp; 
    struct dirent *ep; 

    dp = opendir ("/proc/MYPID/fd/"); 
    if (dp != NULL) 
    { 
     while (ep = readdir (dp)) 
     puts (ep->d_name); 
     (void) closedir (dp); 
    } 
    else 
    perror ("Couldn't open the directory"); 

    return 0; 
} 

を、のようなもの:サポート

ls -l /proc/[pid]/fd/ | wc -l 

オペレーティング・システムprocファイルシステムが含まれますが、 に限定されません。
Solaris
IRIX
ベル研究所からのTru64 UNIX
(非プロセス関連データにを拡張) BSD
のLinux(互換性を向上させるためにLinux上で実装を塩基)
IBM AIX
QNX
プラン9

+2

FreeBSDシステムには/ proc /ファイルシステムがありません。また、これはOPの質問には答えません。 – arne

+0

私はwallykの答えが気に入っていました。これは移植性が高く、サブシステムによって提供されるほとんどの機能に依存しています。しかし、私の場合は、ファイルハンドルをカウントする試みが成功する可能性が高いことを確認する必要があります。すなわち、より多くのファイルハンドルを開閉する必要がない。その意味では、chownのソリューションは、作業に1つだけ多くのファイルハンドルを使用するため、優れています。 –

+2

@CodeMedic:wallykソリューションは、ループ内で開いたり閉じたりするときに、いつでも追加のファイルハンドラを1つだけ要求します。 – salva

0

あなた自身を追跡しない限り、オープンディスクリプタの数を取得する方法(タイプに関係なく)は、ポータブルです。

6

任意の* nixのシステム上で動作するはずです頭に浮かぶアイデアがある:

int j, n = 0; 

// count open file descriptors 
for (j = 0; j < FDMAX; ++j)  // FDMAX should be retrieved from process limits, 
            // but a constant value of >=4K should be 
            // adequate for most systems 
{ 
    int fd = dup (j); 
    if (fd < 0) 
     continue; 
    ++n; 
    close (fd); 
} 
printf ("%d file descriptors open\n", n); 
+0

残酷ですが、非常に興味深いアプローチです。それは "本当の"ファイルと端末やソケットのような他の文字デバイスとを区別しません。 – arne

+4

@arne:OPは差別化を求めていません。開いているファイルハンドルの総数のみ。 – wallyk

+1

それは間違いありませんが、彼が忘れてしまった場合に備えて、私はそれについて言及しました。 – arne

1

OpenSSHはすでにwallykによって提案された二つのアプローチを混合し、必要なものと非常によく似た何かをするclosefrom機能を実装OpenSSHは、少なくともUnix/Linux/BSD/Cygwinシステム間で移植性があります。