2012-07-10 1001 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使用文件指针这实际上包含文件描述符和其他信息有关文件打开指针。

相关问题