我有一個嵌入式環境,用戶可能會插入或移除USB閃存驅動器。我想知道驅動器是否已被移除,或者當我嘗試寫入驅動器時是否存在其他問題。但是,Linux只是將信息保存在緩衝區中,並返回時沒有指示錯誤。
我使用的計算機附帶2.4.26內核和libc 2.3.2。
我安裝的驅動器是這樣的:
i = mount(MEMORY_DEV_PATH, MEMORY_MNT_PATH, "vfat", MS_SYNCHRONOUS, NULL);
這一工程:
50:/root # mount
如何檢測C中的文件寫入錯誤?
/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()來說明我爲了簡單而打算編輯的內容。
您是否嘗試過使用C標準庫I/O函數('fopen','fread','fwrite'等)而不是POSIX? –
您可能還想檢查關閉的錯誤。 –