2

私のコードは 256 を超えるファイル ハンドルを開くため、solaris マシンで実行すると、「ファイル ハンドラの制限を超えています」というエラーが発生します。

これに関して2つ質問があります

1) この制限は 32 ビット ソフトウェアだけのものですか、それとも 64 ビット ソフトウェアも影響を受けますか。私はそれについてグーグルで検索し、64 ビット ソフトウェアにはこの制限がないことを知りました。エラーを出しています。実際に64ビットソフトウェアは何を意味しますか?

2)上記のリンクにあるように、ulimitを使用してファイルハンドラーの制限を増やし(実行時、コマンドを実行する直前を意味します)、extendedFileライブラリをエクスポートしましたが、エラーは発生しません.Linuxの場合に必要なこと?

ありがとうDLクマール

4

5 に答える 5

3

私は以前にこれに遭遇しました。私が知る限り、実際には、solaris の libc のバグであり、8 ビットの符号なし整数型を使用して fd を FILE 構造体に格納しています。どうやら、後方互換性の名目で (プログラムが何らかの理由で FILE 構造体の実装の詳細に依存していた場合に備えて) あまり迅速に変更しなかったようです。これは、Linux やその他の非 Solaris *nix では問題になりません。あなたが引用した記事は合理的な回避策を提案しているので、それらを使用する必要があります。

「64ビット実行可能ファイルとは」に関しては、64ビット命令セット用にコンパイルされた単なるバイナリです。一部のアーキテクチャは両方をサポートし、一部はサポートしません。(たとえば、x86-64 OS では通常、下位互換性のために 32 ビット プロセスが許可されます)。

于 2008-11-23T04:14:07.920 に答える
1

Solaris では、次のいずれかを使用して 64 ビット プログラムを構築します。

cc -xarch=v9 ...

または:

gcc -m64 ...

Evan が言ったように、32 ビット Solaris の根本的な問題は、下位バイナリ互換性と、fd を保持するために使用される 8 ビット整数です。

Solaris 10 for SPARC で次のコードを試しました。

#include <stdio.h>

int main(void)
{
    size_t i;
    for (i = 0; i < 300; i++)
    {
        FILE *fp = fopen("/dev/null", "a");
        if (fp == 0)
        {
            printf("Failed on %zu\n", i);
            return(1);
        }
    }
    printf("Succeeded to %zu\n", i);
    return(0);
}

次のようにコンパイル:

cc -xarch=v9 -o xxx xxx.c

そして、「253で失敗しました」と表示されました。(これはテスト コードです。252 個のポインターが破棄されることはわかっています。) これは、単純な 64 ビット ビルドであるという主張を裏付けています。ただし、リソースの制限という別の要因があります。

$ ulimit -n
256
$

したがって、デフォルトの制限を次のように増やします。

$ ulimit -n 400
$ ulimit -n
400
$ ./xxx
Succeeded to 300
$

それを試してみてください...

于 2008-11-23T05:52:09.767 に答える
1

オブジェクト ファイル (実行可能ファイル) が 64 ビットかどうかを確認するには、file コマンドを使用します (少なくとも Linux では)。

例えば:

$ file `which ls`
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped

$ file my-32bit-exe
my-32bit-exe: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), corrupted section header size

(「破損したセクション ヘッダー サイズ」は気にしないでください。ファイル サイズを縮小するために、exe を手動で変更しました)。

ulimit は Linux で使用できます ( ulimit(1)およびulimit(3)を参照)。

于 2008-11-23T04:09:29.257 に答える
0

Evan Teranが述べたように、solaris libcには、ファイルにこの「奇妙な」制限があり、256未満のファイルハンドルしか処理できません。

これは、ulimitで設定できる制限に関係ありません。この制限は、次の方法でプログラムを使用しないことで設定できます。

#include <sys/resource.h>

struct rlimit rl;
getrlimit(RLIMIT_NOFILE,&rl);
rl.rlim_cur = 1024; /* change it to 1024 - note has to be < than rl.rlim_max */
setrlimit(RLIMIT_NOFILE,&rl);

さて、私もFILE *の使用をやめ、fopenの代わりにopenを使用するなどです。実際にFILE *を使用する必要がある場合は、私が作業したいくつかのプロジェクトで、プログラムの開始時にいくつかのファイル記述子が「予約済み」でした。 「ソケット呼び出しを行うことで、これらを使用してFILE *を取得するための小さなライブラリがあり、ソケットの1つを閉じ、その直後に、閉じたばかりのfdを使用するfopenを実行します。もちろん、fcloseしてソケットを使用してすぐにfdを取得する特別な関数でFILE*を閉じる必要もあります;-)

于 2008-11-23T14:50:23.283 に答える
0

最後に私は解決策を得ました。コードを機能させるために、コードに2つの変更を加えました

1)njsfによって上記で提案されたように

2) 次のように、"F" フラグを指定してファイルを開きます。 FILE *fp = fopen("/dev/null", "wF");

どうもありがとう。DL クマール

于 2008-11-24T10:00:41.603 に答える