1

組み込みアプリでいくつかのreaddir()問題が発生したため、この自己完結型テストをアプリ コードの便利な場所に追加しました。

FILE *f;
DIR *d;

f = fopen ("/mnt/mydir/myfile", "r");
printf ("fopen %p\r\n", f);
if (f) fclose(f);

d = opendir ("/mnt/mydir");
printf ("opendir ret %p\r\n", f);
if (d)
{
    struct dirent *entry;
    do
    {
    errno = 0;
    entry = readdir (d);
    printf ("readdir ret %p %s, errno %d %s\r\n", entry, entry ? entry->d_name : "", errno, strerror(errno));
    } while (entry);
    closedir (d);
}

/mnt/mydirは NFS マウントです (関連性があるかどうかはわかりませんが)。そのfopen()ディレクトリでファイルを開く呼び出しは常に成功し、opendir()そのディレクトリでの も常に成功します。ただし、(ほとんどの場合) が でreaddir()失敗することがありerrno=EFAULTます。

アプリの他の場所がそのディレクトリで何かをしているとは思いません。テストは書かれているとおりで、すべての変数はローカル スタック スコープです。

スタンドアロン プログラムとして実行すると、常に成功します。

ここで EFAULT を引き起こす可能性があるものについて、誰か提案を提供できますか? DIR構造自体が破損している可能性がありますが、DIRポインター変数が破損していないと確信しています。ヒープが破損している証拠は他に見たことがありません。

4

2 に答える 2

0

ページからman 2 readdir

       EFAULT Argument points outside the calling process's address space.

これは、構造が破損していることを意味します

于 2013-02-14T10:31:44.700 に答える
0

私は問題を見つけたと思います。opendir/readdir の uClibc 実装は、ディレクトリで stat() を実行し、その後、サイズ statbuf.st_blksize のスタック alloca() を実行します。私の NFS ディレクトリは rsize=512KB でマウントされていたため、readdir() がスタックに 512KB を割り当ててへこみを保持しようとしました。私の組み込みセットアップにはスタック間にそれほど余裕がないため、ある時点でメモリ内の何かにヒットし、EFAULT が発生していました。

NFS マウント オプションを rsize=4096 に変更すると、問題なく動作します。

于 2013-02-28T11:43:31.190 に答える