Linux中write和writev的区别,write() vs writev()
Linux中write和writev()的区别:我觉得StackOverflow上面的回答写的很好,see: write vs writev下面是我自己的总结:函数原型:write#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);表示从buf开始的缓冲区向文件描述符fd所引用的文件写入coun
·
Linux中write和writev()的区别:
我觉得StackOverflow上面的回答写的很好,see: write vs writev
下面是我自己的精简版总结,觉得上面的回答太长可以看一下:
函数原型:
- write
表示从buf开始的缓冲区向文件描述符fd所引用的文件写入count字节数。#include <unistd.h> ssize_t write(int fd, const void *buf, size_t count);
- writev
表示像文件描述符fd所关联的文件写入iovcnt个缓冲区的数据,缓冲区是由iov来标识的,iov表示结构体数组的指针。(也就是有可能将多个缓冲区的数据写入一个文件当中,被称为gather output,汇聚写,同样类似的有readv,分散读)#include <sys/uio.h> ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
区别
这里最好看一下上面的链接,写的很详细,如果觉得太长,下面是精简的总结。
- writev允许处理非连续的数据块。也就是说,缓冲区可以逐个单独分配,不用是一块连续的较大的地址空间。
- writev 的I/O是“原子的”。例如,如果你执行一个writev操作,所有数据将在一个连续操作中被写入,不会被中断。
- 如果使用write,则必须在以下两种情况下进行选择:使用memcpy(带来额外开销)将它们复制到一个内存块中,然后再执行一个write调用。
- 进行三个独立的write调用(带来额外开销)。另外,来自其他进程的write调用可以分散在这些write之间(也就是整体上看不是原子操作)。
更多推荐
已为社区贡献1条内容
所有评论(0)