2014-12-20 23 views
1

我正在寫一些代碼爲我的程序安裝使用USB卸除統計:對設備

mount("/dev/sda", "/media", "vfat", MS_NOATIME, NULL) 

閃存驅動器,並使用卸載不合適的ioctl

status = umount2("/media",MNT_DETACH); 
qDebug("USB unmount - status = %s\n", strerror(errno)); 

的消息稱:USB unmount - status = Inappropriate ioctl for device 時實際上閃光燈已成功卸載。我在這裏做錯了什麼?

目標系統是Debian和我使用C++使用Qt

+0

'status'的值是什麼? –

+0

這是哪一種語言?蟒蛇? – tripleee

+0

@MarkPlotnick狀態的值爲0.根據http://linux.die.net/man/2/umount,它應該是成功的? – Timtianyang

回答

1

你看到的 - 從系統調用接口函數返回零,表示成功,但具有非零errno - 是正常的。這是因爲通常系統調用接口函數和一些其他C函數在出現故障時僅設置errno,否則保持不變。 (嚴格來講,errno成功的函數調用後的值是不確定

下面是來自POSIX standard報價:

errno的值應是一個函數的調用後才定義爲此它被明確聲明爲被設置,直到它被下一個函數調用改變,或者如果應用程序給它賦值。

errno的值應該只在通過函數的返回值指示有效時才被檢查。

成功調用函數後,errno的設置未指定,除非該函數的描述指定不應修改errno。在文檔

尋找umount2

如果成功,則返回零。出錯時,返回-1,並且適當地設置errno。

因此您致電umount2成功,並且errno的值未指定。很可能errno是由其他最近稱爲失敗的函數設置的。您可以在程序上運行strace以查看哪個系統調用失敗;由於該錯誤與ioctl相關,該函數可能是stdio基礎結構的一部分,這些基礎結構正在探查stdout的屬性,這是正常的。

+0

好的電話。我應該先檢查返回的值,然後打印輸出錯誤消息。 errno確實是由以前的函數調用設置的。 – Timtianyang