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