0
DIR *dir_ptr;
struct dirent *dir_entery;
dir_ptr = opendir("/tmp");

while (dir_ptr&&(dir_entery = readdir(dir_ptr))) {
   printf("%s \n", dir_entery->d_name);
}

printf("%s \n", strerror(errno));

次の出力が得られます。

file_name
dir_name
errno = Remote I/O error

/tmp実行後に readdir に到達すると、1 つのディレクトリと 2 つのファイルopendir(dir)があり、その間に終了し、次のエラーが表示されます。

errno = Remote I/O error

ディレクトリ内の dir の後にファイルを読み取れないのはなぜ/tmpですか?

4

1 に答える 1

1

readdir()を返すように文書化されていないため、誤解を招く情報を提供する可能性がREREMOTEIO最も高いです。sterror()

ループに入る、つまり を呼び出すに に設定errnoします。0 while()readdir()

からman readdir:

ディレクトリ ストリームの最後に到達すると、NULL が返され、 errno は変更されません。エラーが発生した場合は、NULL が返され、errnoが適切に設定されます。ストリームの終わりとエラーを区別するには、readdir()を呼び出す前にerrnoをゼロに設定し、NULL が返された場合はerrnoの値を確認します。

返品時にこれら2 つのケースをテストするには、コードを次のように変更します。readdir()NULL

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

  ...

  DIR * dir_ptr = opendir("/tmp");
  if (NULL != dir_ptr)
  {
    perror("opendir() failed");
  }
  else
  {
    struct dirent * dir_entery;

    errno = 0; 
    while ((dir_entery = readdir(dir_ptr))) /* an extra pair of parenthesis here to silence GCC */
    {
      printf("%s\n", dir_entery->d_name);
    }

    if (0 != errno)
    {
      perror("readdir() failed");
    }
    else
    {
      printf("No more entries.\n");
    }
  }

  ...
于 2013-05-30T16:50:34.930 に答える