2012-07-10 1008 views
8

我目前正在寫在C一個回調函數:fwrite和write之間的主要區別是什麼?

static size_t writedata(void *ptr, size_t size, size_t nmemb, void *stream){ 

     size_t written = fwrite(ptr, size, nmemb, (FILE)*stream); 
     return written; 
} 

該功能會在另一個函數,它做了HTTP請求,檢索請求,並將其寫入到本地計算機中使用。 writedata函數將用於後面的部分。整個操作必須是multithreaded,所以我在writefwrite之間存在疑問。有人能幫我概述和fwrite()C之間的區別,所以我可以選擇哪一個最適合我的問題?

回答

16

fwrite寫入FILE*,即(可能)緩存的stdio流。它由ISO C標準規定。另外,在POSIX系統上,fwrite is thread-safe在一定程度上。

write是基於POSIX標準中描述的文件描述符的低級API。它不知道緩衝。如果要在FILE*上使用它,請使用fileno獲取其文件描述符,但請務必手動鎖定並刷新流,然後再嘗試write

使用fwrite除非你知道你在做什麼。

+3

但有一點需要注意的是,你可能不應該從多個線程訪問一個FILE結構(包括但不限於調用fread/fwrite),而這樣做通常更安全與低級別的文件描述符...但仍然不是一個好主意,沒有一些同步:) – snemarch 2012-07-10 13:32:24

1

write函數是您的程序對操作系統的調用,因此它比fwrite慢。它也缺乏緩衝,這使得它甚至較慢,因爲緩衝哲學暗示:「處理小文件的許多部分而不是大文件更快」。 write不是c標準的一部分也很重要,所以你可能不會發現它是非POSIX系統,並且(很少)適當的使用會有所不同。你也應該知道fwrite和fread有時候會使用writeread來實現(一個簡單的實現可以在K & R關於Unix的章節中找到)。

另一個noteable事情是readwrite使用file descriptors,但FREAD和fwrite使用文件指針這實際上包含文件描述符和其他信息有關文件打開指針。

相關問題