Linux中write和writev()的区别:

我觉得StackOverflow上面的回答写的很好,see: write vs writev

下面是我自己的精简版总结,觉得上面的回答太长可以看一下:

函数原型:

  1. write
    #include <unistd.h>
    
    ssize_t write(int fd, const void *buf, size_t count);
    
    表示从buf开始的缓冲区向文件描述符fd所引用的文件写入count字节数。
  2. writev
    #include <sys/uio.h>
    
    ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
    
    表示像文件描述符fd所关联的文件写入iovcnt个缓冲区的数据,缓冲区是由iov来标识的,iov表示结构体数组的指针。(也就是有可能将多个缓冲区的数据写入一个文件当中,被称为gather output,汇聚写,同样类似的有readv,分散读

区别
这里最好看一下上面的链接,写的很详细,如果觉得太长,下面是精简的总结。

  1. writev允许处理非连续的数据块。也就是说,缓冲区可以逐个单独分配,不用是一块连续的较大的地址空间。
  2. writev 的I/O是“原子的”。例如,如果你执行一个writev操作,所有数据将在一个连续操作中被写入,不会被中断。
  3. 如果使用write,则必须在以下两种情况下进行选择:使用memcpy(带来额外开销)将它们复制到一个内存块中,然后再执行一个write调用。
  4. 进行三个独立的write调用(带来额外开销)。另外,来自其他进程的write调用可以分散在这些write之间(也就是整体上看不是原子操作)。
Logo

更多推荐