使用以下例程复制文件时,我发现了非法搜索"错误。可能导致什么?它们都是普通文件。
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;
}
答案 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
。