2012-01-17 9 views
1

私は(組み込み環境で)C言語でプログラミングしています。 USBをそのデバイスに接続することができます。今では、USBからそのデバイスに自分のコードを介してファイルをコピーしているときに、誰かがpendriveを削除した場合、どのようにpendriveの削除やこのような状況を処理するかを検出できます。ファイルのコピー中にペンドライブが取り外されました

デバイスアーキテクチャ:ARM、Linuxプラットフォーム

Iは、ファイルが完全にそれがコピーされた場所からソース、コピーされることになっている先のファイルサイズを比較することにより、コピーされているかどうかを介して確認することができ。 しかし、plsは、ファイルが正常にコピーされるかどうかを確認するための他の方法を教えています(pendriveを間に置いた場合)。ソースデバイスが突然行方不明になった場合

sprintf(str, "cp %s%s /mnt/disk/.;sync", FILE_OP_PATH, name); 
96     system(str); 
+0

デバイスの取り付け/取り外しのホットプラグのブロックイベントが発生します。これらはマウント/アンマウントをトリガすることができます。また、この場合にクリーンアップする方法を見つけることもできます。 – blueshift

答えて

1

低レベルのエラーでも、ファイルシステムは不潔な状態のままであり、検証する必要があります。

これは予想される操作方法またはよりまれなエラーのようなイベントになりますか?

テストケースの場合は、コードが爆発しないようにするか、無限ループが書き込みを再試行するような奇妙なことをしてください。デバイス上のファイルシステムは、あなたがVFATを考えているUSBを話しているので、不潔な状態に置かれることもあります。間違ったファイルサイズが報告されることがあります。

+0

"まれなエラーのようなイベント" - テストケースになります。 – john

+1

USBデバイスが読み込み中だった場合は、かなり安全だと思います。しかし、ファイルシステムがアクセスタイムトラッキングをしているかどうかを調査したいかもしれません。 – unwind

+0

@unwind:読み込みには良い点があり、読み込み専用にマウントすると、その手順が非常に安全になります。しかし、私はそれを書くことになるだろうと書いています。 –

4

まあ、システムコール(複数可)あなたは(標準ライブラリを介して直接または間接的に)やっているが失敗します。このようなIAMのコピー。

あなたがUSBドライブからの読み込みを昔ながらread()を使用している場合、私は失敗することをespectとEIOerrnoを設定しますが、ドキュメントは述べて:

があるときそれはまた発生する可能性がありますディスクまたはテープからの読み取り中に低レベルのI/Oエラーが発生しました。

強制的にアンマウントされたドライブは、「低レベルのI/Oエラー」のように聞こえます。

上記のように、最初に障害を検出するのが最も簡単です。もちろん、あなたのコピーコードでは既に行われていますが、フォローアップとして、何が間違ったのかを診断してエラーを引き起こします。デバイスがまだ周辺にいるかどうかを確認するためにマウントテーブルを調べることができます。

+0

良い説明... – john

+0

良い説明 –

0

私の解決策が遅いですが、あなたはあなたが何かをUSBポートに抜き差しされたときに通知するudevを使用して構成できます:)

0

をコピーするif(fopen("myfile", "r")!=NULL)ごとを試すことができます。

関連する問題