以前一直都是用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,参数可能不能一次搞对,比如,没有带第三个参数,那么生成的文件权限也会不对,于是后继再执行这个程序,就会有PermissionDeny,无法覆盖掉先前生成的文件。解决方法是手动用sudo权限删除掉生成的文件,重新执行正确的程序。