2015-11-02 65 views
0

下面的鏈接說,讀是一個系統調用: What is the difference between read() and fread()?什麼使read()成爲系統調用?

現在,我想了解是什麼讓閱讀系統調用。

例如
我使用Nuttx OS和註冊的器件結構flash_dev(路徑 '的/ dev/FLASH0')與打開,關閉和ioctl方法。這是作爲信息文件系統中的inode添加的,信號量支持互斥。

現在,從應用程序打開('/ dev/flash0')並且讀取& ioctls。
現在,在上述過程中的哪一部分使讀取系統調用?

+0

我不明白,你爲什麼認爲'read'不是系統調用? –

+0

@YuHao這段代碼在特權模式下執行? – sniper

回答

1

read()函數是調用系統IOW調用系統調用所需的任何指令的薄包裝器。當你調用read()(和fread())時,相關的內核/驅動程序代碼會被調用,並執行從文件讀取所需的任何操作。

+0

重要的區別是'fread' _may_不涉及系統調用。如果它能滿足來自用戶空間緩衝區的請求,則不會發生系統調用。 'read',作爲一個簡單的包裝器,總是執行系統調用,如果你正在做很多小的read操作,這會很昂貴(對於大型read操作,系統調用開銷被I/O無論如何,開銷和'fread'都需要執行相同的系統調用)。 – ShadowRanger

1

系統調用是一種調用,其功能幾乎全部存在於內核而不是用戶空間中。傳統上,open(),read(),write()等是在內核中,而fread(),fwrite()等則有在用戶空間運行的代碼,可以根據需要調用內核。

例如,在Linux中,當你調用read(),您的應用程序鏈接的是標準庫不妨做到以下幾點:

mov eax, 3   ;3 -> read 
    mov ebx, 2   ;file id 
    mov ecx, buffer 
    mov edx, 5   ;5 bytes 
    int 80h 

這就是它 - 它只是需要你傳遞的參數,並通過調用內核int 80(中斷)指令。作爲應用程序員,調用是在用戶空間還是在內核中運行,或者兩者兼而有之並不重要。這對於調試或性能的原因可能很重要,但對於簡單的應用程序來說,它並不重要。

相關問題