分散/聚集IO demo

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jpzhu16/article/details/82320902

分散/聚集IO demo

代码

功能: 实现将一个文件内容copy到另外一个指定的文件中。

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

#include <fcntl.h>

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <sys/uio.h>

#define BUFFER_SIZE 256



int main (int argc, char *argv[]){



  ssize_t fd_input = open("/home/os/Papers/Technical-Documents/OS/Linux_System_Programming/code/file/testRead.c",O_RDONLY);

  if (fd_input == -1){

    perror("input:");

  }



  ssize_t fd_output = open("/home/os/Papers/Technical-Documents/OS/Linux_System_Programming/code/file/output",O_WRONLY | O_APPEND);

  if (fd_output  == -1){

    perror("output:");

  } 



  char buffer1[BUFFER_SIZE]; 

  char buffer2[BUFFER_SIZE];

  char buffer3[BUFFER_SIZE];

  char buffer4[BUFFER_SIZE];

  char buffer5[BUFFER_SIZE];

  char buffer6[BUFFER_SIZE];

  char buffer7[BUFFER_SIZE];

  char buffer8[BUFFER_SIZE];



  memset(&buffer1,0,BUFFER_SIZE);

  memset(&buffer2,0,BUFFER_SIZE);

  memset(&buffer3,0,BUFFER_SIZE);

  memset(&buffer4,0,BUFFER_SIZE);

  memset(&buffer5,0,BUFFER_SIZE);

  memset(&buffer6,0,BUFFER_SIZE);

  memset(&buffer7,0,BUFFER_SIZE);

  memset(&buffer8,0,BUFFER_SIZE);



  struct iovec iovs[8];

  iovs[0].iov_base = buffer1;

  iovs[0].iov_len = sizeof(buffer1);

  iovs[1].iov_base = buffer2;

  iovs[1].iov_len = sizeof(buffer2);

  iovs[2].iov_base = buffer3;

  iovs[2].iov_len = sizeof(buffer3);

  iovs[3].iov_base = buffer4;

  iovs[3].iov_len = sizeof(buffer4);

  iovs[4].iov_base = buffer5;

  iovs[4].iov_len = sizeof(buffer5);

  iovs[5].iov_base = buffer6;

  iovs[5].iov_len = sizeof(buffer6);

  iovs[6].iov_base = buffer7;

  iovs[6].iov_len = sizeof(buffer7);

  iovs[7].iov_base = buffer8;

  iovs[7].iov_len = sizeof(buffer8);



  ssize_t ret_readv;

  ssize_t ret_writev;

  while((ret_readv = read(fd_input,iovs,8)) != 0){

    if(ret_readv == -1){

      if (errno  == EINTR){

         continue;

      }

      perror("read:");

      break;

    }

    ret_writev = write(fd_output,iovs,8);

    if (ret_writev == -1){

      if(errno == EINTR){

        continue;

      }

      perror("write:");

      break;

    }

  }

  int ret = fdatasync(fd_output);

  printf("sync:%d\n",ret);

  if (close(fd_output) == -1){   //The fd_output is closed that is input file desctiptor. It is the second for the open sort.

    perror("fd_outpt:");

  }  

  if (close(fd_input)  == -1){

    perror("fd_input:");

  }

  return 0;

}

参考

代码参见我的github: https://github.com/JunpengCode/Papers/blob/master/Technical-Documents/OS/Linux_System_Programming/code/file/testCopyV.c

猜你喜欢

转载自blog.csdn.net/jpzhu16/article/details/82320902