32bit 実行ファイルで cifs マウント先の readdir() が NULLになる
次のプログラムを x86_64 Linux 環境 (Centos7) でコンパイルし、CIFSでマウントした ディレクトリの中身を 表示させようとしました。
gcc のオプションに -m32
をつけて 32bit でコンパイルしたときと、64bit でコンパイルした場合で、動作が異なり 32bit だと正しく 表示されません。
なぜ 32bit 版は正常に動作しないのでしょうか。
または、正常に動作させる方法が分かれば教えてください。
追記
errno
の値と、perror()
でエラーメッセージを表示させるようにサンプルを変更しました。
errno:12: Cannot allocate memory
と表示されましたが、メモリは 1GB以上空いてるので メモリ不足ということはないと思います。
追記ここまで
// readdir() sample code
// usage : programname directory
#include <stdio.h>
#include <dirent.h>
#include <errno.h>
int main(int argc, char **argv) {
struct dirent *entry;
DIR *dir;
int cnt = 0;
char errmsg[16];
// 引数チェック
if (argc <= 1) return 2;
dir = opendir( argv[1] );
if (dir == NULL) return 1;
printf( "directory opened\n");
while( (entry = readdir(dir)) != NULL) {
// ディレクトリ エントリーの名前を表示
printf("d_name: %s\n", entry->d_name);
cnt++;
}
// errno メッセージを表示
sprintf(errmsg, "errno:%d", errno);
perror(errmsg);
closedir( dir );
printf( "directory closed\n");
// ディレクトリエントリの数を表示
printf( "cnt = %d\n", cnt );
return 0;
}
コンパイル
$ gcc -m32 -o a.i686 sample.c
$ gcc -o a.x86_64 sample.c
実行結果
$ ./a.x86_64 /mnt/cifs/
directory opened
d_name: . ←ディレクトリの中身が参照できてる
d_name: .. ←ディレクトリの中身が参照できてる
d_name: test.txt ←ディレクトリの中身が参照できてる
errno:0: Success
directory closed
cnt = 3 ←中身は 3件あった
$ ./a.i686 /mnt/cifs/
directory opened
errno:12: Cannot allocate memory ←メモリが確保できない?
directory closed
cnt = 0 ←中身が 0件となる
クライアント環境
- Linux datacos7 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
- CentOS Linux release 7.6.1810 (Core)
- cifs-utils-6.2-10.el7.x86_64
- gcc-4.8.5-36.el7.x86_64
- glibc-2.17-260.el7_6.3 (i686とx86_64)
サーバー環境
- Windows 2016 Server