2012-01-17 57 views
1

我正在使用C語言(在嵌入式環境中)編程。 USB可以連接到該設備。現在,當我通過我的代碼將文件從USB複製到該設備時,如果有人刪除了pendrive,那麼我們如何檢測pendrive的刪除或如何處理這種情況。複製文件時移除筆式驅動器

設備架構:ARM,Linux平臺

我可以從它被複制源代碼,哪裏假定目標比較文件大小通過文件是否完全複製檢查或不被複制。 但請讓我知道任何其他方法,以確保文件複製成功與否(如果pendrive之間刪除)。 Iam複製如下:

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

您會獲取設備連接/刪除的熱插拔塊事件。這些可以觸發mount/unmount,你也可以在這種情況下找到如何掛鉤進行清理。 – blueshift 2012-01-20 11:46:26

回答

1

這是一個低級錯誤,文件系統也將處於不潔狀態並應該進行驗證。

這是預期的操作方法還是更罕見的錯誤事件?

如果是測試用例,只要確保代碼不會爆炸或執行其他奇怪的事情,如無限循環重試寫入。設備上的文件系統也可能處於不潔的狀態,因爲您在說USB,我在想VFAT。可能會報告錯誤的文件大小。

+0

「罕見的錯誤事件」 - 將成爲一個測試用例。 – john 2012-01-17 09:50:37

+1

如果USB設備只是從中讀取,我認爲它應該是非常安全的。不過,您可能想要調查文件系統是否執行任何訪問時間跟蹤。 – unwind 2012-01-17 10:37:05

+0

@unwind:讀取的好處,將其以只讀方式安裝會使程序非常安全。但我讀它,因爲它將是寫操作。 – 2012-01-17 11:29:40

4

那麼,如果源設備突然丟失,系統調用(直接或間接通過標準庫)將會失敗。

如果你使用普通的舊read()從USB驅動器讀取,我會espect它失敗和設定errnoEIO,如文檔指出:

它也可以當有發生從磁盤或磁帶讀取時發生低級I/O錯誤。

讓驅動器強行卸載中讀取聲音就像是「低級I/O錯誤」。

根據上面的說法,首先檢測失敗可能是最容易的,當然您的複製代碼已經可以執行了,然後作爲後續嘗試提出診斷錯誤和導致錯誤的原因,您大概可以檢查安裝臺,看看設備是否還在附近。

+0

好的解釋... – john 2012-01-17 09:38:05

+0

好的解釋 – 2012-01-17 11:34:00

0

雖然我的解決方案是緩慢的,你可以嘗試if(fopen("myfile", "r")!=NULL)每複製:)

0

你可以使用和配置udev某事什麼時候插入或拔下USB端口上的通知。

相關問題