close()系统调用需要很长时间才能完成

时间:2016-03-16 00:12:11

标签: c linux file linux-kernel

我正在使用$ho = $raw_wrap->{"field_hours_$x"}['und'][0]['value']; $days_array[$x]['hours_open'] = date('H:i', strtotime($ho)); $hc = $raw_wrap->{"field_hours_$x"}['und'][0]['value2']; $days_array[$x]['hours_close'] = date('H:i', strtotime($hc)); 测试性能,以便在Linux 6.4下复制大文件。 我的代码遵循以下逻辑,并使用gcc编译

sendfile()

}

 read_fd = open (argv[1], O_RDONLY);
 fstat(read_fd, &stat_buf);
 write_fd = open (argv[2], O_WRONLY | O_CREAT, stat_buf.st_mode);

 left_to_write = stat_buf.st_size;
 while (left_to_write > 0) {
      written=sendfile (write_fd, read_fd, &offset, stat_buf.st_size);
      if (written == -1)
           return -1;
      else {
         left_to_write -= written;
         bytes_done=stat_buf.st_size-left_to_write;           
         printf("%ld bytes written, %ld bytes left to write\n", written,  left_to_write);
  }

close(read_fd); close(write_fd); /* this takes minutes */ 来电非常快;我可以看到它大约每5秒写一次2GB的块。

sendfile()循环结束时,它会在while之前保持几分钟,然后才能成功完成。

为什么close(output)需要这么长时间才能运行?它是否正在冲洗缓冲区?我怎样才能让它更快?

1 个答案:

答案 0 :(得分:1)

这是由于回写。 close(output)必须报告尚未报告的任何写入错误;例如,它必须确保已分配数据所需的所有块,否则报告ENOSPC

close()返回时,数据不一定写入磁盘;如果你想要这个,你需要拨打fsync()(并忍受更长时间的等待)。

另见手册页的NOTES部分。