ユーザーが USB フラッシュ ドライブを挿入または取り外す可能性のある組み込み環境があります。ドライブが取り外されたのか、それともドライブに書き込もうとしたときに他の問題があるのかを知りたいです。ただし、Linux は情報をバッファーに保存するだけで、エラーを表示せずに戻ります。
私が使用しているコンピューターには、2.4.26 カーネルと libc 2.3.2 が付属しています。
私はこの方法でドライブをマウントしてい
i = mount(MEMORY_DEV_PATH, MEMORY_MNT_PATH, "vfat", MS_SYNCHRONOUS, NULL);
ます:
50:/root # mount
/dev/scsi/host0/bus0/target0/lun0/part1 on /mem type vfat (rw,sync)
50:/root #
後で、ファイルをコピーしようとします。
int ifile, ofile;
ifile = open("/tmp/tmpmidi.mid", O_RDONLY);
if (ifile < 0)
{
perror("open in");
break;
}
ofile = open(current_file_name.c_str(), O_WRONLY | O_SYNC);
if (ofile < 0)
{
perror("open out");
break;
}
#define BUFSZ 256
char buffer[BUFSZ];
while (1)
{
i = read(ifile, buffer, BUFSZ);
if (i < 0)
{
perror("read");
break;
}
j = write(ofile, buffer, i);
if (j < 0)
{
perror("write");
break;
}
if (i != j)
{
perror("Sizes wrong");
break;
}
if (i < BUFSZ)
{
printf("Copy is finished, I hope\n");
close(ifile);
close(ofile);
break;
}
}
このコード スニペットを書き込み禁止の USB メモリで実行すると、結果は次のようになります。
Copy is finished, I hope
コンソールのカーネルからのエラーメッセージが殺到する中.
USBドライブを(アンマウントせずに)単に取り外した場合も同じことが起こると思います。
私もdevfsをいじりました。(REGISTERイベントを使用して)ドライブを自動的にマウントする方法を見つけましたが、メモリを引き出したときにUNREGISTERをトリガーすることはないようです。
ファイルが正常に作成されたかどうかをプログラムで判断するにはどうすればよいですか?
7 月 4 日更新: close() からの結果をチェックしないのは私のばかげた見落としでした。残念ながら、ファイルはエラーなしで閉じることができます。それで、それは助けにはなりませんでした。fsync() はどうですか? それは良い考えのように思えますが、それもエラーをキャッチしませんでした。
/sys にこんなものがあったら面白い情報があるかもしれません。2.6まで追加されなかったと思います.?.
私のフラッシュドライブの品質に関するコメントはおそらく正当なものです. 初期のものの一つです。実際、ライト プロテクト スイッチは、最近では非常にまれなようです。
過剰なオプションを使用する必要があると思います。ファイルを作成し、ドライブをアンマウントして再マウントし、ファイルが存在するかどうかを確認します。それでも問題が解決しない場合は、何かがおかしいのです。自分へのメモ: 作成しようとしているファイルがまだそこにないことを確認してください。
ところで、これはたまたま C++ プログラムです。簡単にするために編集するつもりだった .c_str() でわかります。