以前一直都是用fopen、fwrite等高级函数写文件,这次尝试用open、write、close操作文件。代码如下:
int ret = OB_SUCCESS; int fd = open(config_file, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU | S_IRWXG | S_IRWXO); static const int64_t buf_len = 512; int64_t pos = 0; char buf[buf_len]; ssize_t size = 0; const char * config_file = "my.conf"; if (0 >= fd) { TBSYS_LOG(WARN, "fail to create temp config file %s. msg=%s", config_file, strerror(errno)); ret = OB_ERROR; } else { TBSYS_LOG(WARN, "fd=%d", fd); if (OB_SUCCESS == ret) { pos = 0; databuff_printf(buf, buf_len, pos, "[%s]\n", OBMS_RS_SECTION); OB_ASSERT(pos < buf_len); size = write(fd, buf, pos); if (size <= 0) { TBSYS_LOG(WARN, "fail %s", strerror(errno)); ret = OB_ERROR; } } close(fd); }
重点:
open(config_file, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU | S_IRWXG | S_IRWXO);
表示创建文件,用于写入。如果文件已经存在,则先将文件原有内容清空再写。重点是后面S_IRWXU | S_IRWXG | S_IRWXO这个参数,这里它表示所有人都拥有对生成文件的读写执行权限。这个一般来说不会有什么问题。可能遇到的问题是:
第一次学习写open,参数可能不能一次搞对,比如,没有带第三个参数,那么生成的文件权限也会不对,于是后继再执行这个程序,就会有Permission Deny,无法覆盖掉先前生成的文件。解决方法是手动用sudo权限删除掉生成的文件,重新执行正确的程序。