使用sendfile将文件从A复制到B - 非法搜索?

时间:2016-04-01 03:31:29

标签: c linux

使用以下例程复制文件时,我发现了非法搜索"错误。可能导致什么?它们都是普通文件。

bool copyfile(const char* src, constchar* dest, bool overwrite_existing)
{
  if (!overwrite_existing && file_exists(dest_filename))
    return false;

  int read_fd;
  int write_fd;
  struct stat stat_buf;
  off_t offset = 0;

  printf("src_filename=%s\n", src_filename.str());

  if (read_fd = open(src_filename, O_RDONLY) == -1)
    return false;

  if (fstat(read_fd, &stat_buf) == -1){
    perror("fstat\n");
    return false;
  }

  write_fd = open(dest_filename, O_WRONLY | O_CREAT | O_TRUNC, stat_buf.st_mode);
  if (write_fd == -1){
    close(read_fd);
    return false;
  }

  int result = sendfile(write_fd, read_fd, &offset, stat_buf.st_size);
  printf("result=%d, err=%s\n", result,strerror(errno));

  close(read_fd);
  close(write_fd);
  return result > 0;
}

1 个答案:

答案 0 :(得分:5)

if (read_fd = open(src_filename, O_RDONLY) == -1)

你遗漏了一些括号。 ==运算符的优先级高于=。因此,假设open()成功,您将read_fd设置为0.因此,您的sendfile正在尝试从标准输入读取,这可能不是常规文件。 sendfile仅支持从常规文件中读取。因此失败。

使用gcc -Wall进行编译会向您发出警告:suggest parentheses around assignment used as truth value

始终使用编译器警告,永远不要忽略它们!