fwrite和write之间的主要区别是什么?

我目前正在C编写回调函数:

 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之间存在疑问。 有人可以帮我概述C write()fwrite()之间的区别,所以我可以选择哪一个最适合我的问题?

fwrite写入FILE* ,即(可能)缓冲的stdio流。 它由ISO C标准规定。 此外,在POSIX系统上, fwrite在某种程度上是线程安全的 。

write是基于文件描述符的低级API,在POSIX标准中描述。 它不知道缓冲。 如果要在FILE*上使用它,则使用fileno获取其文件描述符,但在尝试write之前,请务必手动锁定并刷新流。

除非你知道自己在做什么,否则请使用fwrite

write函数是程序对操作系统的调用,因此它比fwrite慢。 它也缺乏缓冲 ,这使得它更慢,因为缓冲的哲学暗示:“处理小文件的许多部分而不是大文件更快。” write不是c标准的一部分也很重要,因此您可能无法找到非POSIX系统,并且(很少)适当的使用会有所不同。 您还应该知道fwrite和fread有时使用writeread实现(一个简单的实现可以在关于K&R的Unix的章节中找到)。

另一个值得注意的事情是readwrite使用文件描述符 ,但是fread和fwrite使用FILE指针 ,这些指针实际上是包含文件描述符的指针以及有关打开文件的其他信息。

一个非常明显的区别是写入是primefaces而fwrite不是。

https://yarchive.net/comp/linux/wakekill.html

使用:

 #include  #include  #include  #include  int main() { if (fork() == 0) { FILE* h = fopen("file.txt", "a"); char* line = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"; for (int i = 0; i < 10000; i++) { if (write(fileno(h), line, strlen(line)) != strlen(line)) { perror("Could not append line to file"); exit(1); } } if (fclose(h) != 0) { perror("Could not close file"); exit(1); } } else { FILE* h = fopen("file.txt", "a"); char* line = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"; for (int i = 0; i < 10000; i++) { if (write(fileno(h), line, strlen(line)) != strlen(line)) { perror("Could not append line to file"); exit(1); } } if (fclose(h) != 0) { perror("Could not close file"); exit(1); } } return 0; } 

您将获得这样的输出,没有交错行:

 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 

使用:

 #include  #include  #include  #include  int main() { if (fork() == 0) { FILE* h = fopen("file.txt", "a"); char* line = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"; for (int i = 0; i < 10000; i++) { if (fwrite(line, 1, strlen(line), h) != strlen(line)) { perror("Could not append line to file"); exit(1); } } if (fclose(h) != 0) { perror("Could not close file"); exit(1); } } else { FILE* h = fopen("file.txt", "a"); char* line = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"; for (int i = 0; i < 10000; i++) { if (fwrite(line, 1, strlen(line), h) != strlen(line)) { perror("Could not append line to file"); exit(1); } } if (fclose(h) != 0) { perror("Could not close file"); exit(1); } } return 0; } 

您将获得这样的输出,交错行:

 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa