Linux系统中O_APPEND和O_TRUNC标志的使用方法

大家好,我是st。
     今天主要和大家聊一聊,open函数的的flags标志,譬如:o_append和o_trunc标志的使用方法。
第一:o_trunc标志使用方法
       使用该标志o_trunc的时候,调用open函数打开文件的时候会将文件原本的内容全部丢弃,文件大小变为0;下面对文件的操作代码如下:
#include #include #include #include #include #icclude int main(void){ int fd; /* 打开文件 */ fd = open(./test_file, o_wronly | o_trunc); if (-1 == fd) { perror(open error); exit(-1); } /* 关闭文件 */ close(fd); exit(0);}  
     在当前目录下有一个文件test_file,测试代码中使用了o_trunc标志打开该文件,代码中仅仅只是打开文件,并没有对其进行读写操作,接下来编译运行来看看测试结果;
第二:o_append使用方法
    接下来聊一聊,使用o_append标志方法,如果open函数携带并使用了o_append标志,调用open函数打开文件,当每次使用write()函数对文件进行读写操作时,都会自动把文件当前位置偏移量移动到文件末尾,从文件末尾开始写入数据,也就是意味着每次写入数据都是从文件末尾开始。这里我们直接进行测试,测试代码如下所示:
#include #include #include #include #include #include #include int main(void){   char buffer[16];   int fd;   int ret;   /* 打开文件 */ fd = open(./test_file, o_rdwr | o_append); if (-1 == fd) { perror(open error); exit(-1); } /* 初始化 buffer 中的数据 */ memset(buffer, 0x55, sizeof(buffer)); /* 写入数据: 写入 4 个字节数据 */ ret = write(fd, buffer, 4); if (-1 == ret) { perror(write error); goto err; } /* 将 buffer 缓冲区中的数据全部清 0 */ memset(buffer, 0x00, sizeof(buffer)); /* 将位置偏移量移动到距离文件末尾 4 个字节处 */ ret = lseek(fd, -4, seek_end); if (-1 == ret) { perror(lseek error); goto err; }  //读取数据 ret=read(fd,buffer,4); if(-1==ret) {  perror(read error);    goto err; }printf(0x%x 0x%x 0x%x 0x%x, buffer[0], buffer[1],buffer[2], buffer[3]);  ret = 0;err: /* 关闭文件 */ close(fd); exit(ret);  }  
测试代码中会去打开当前目录下的 test_file 文件,使用可读可写方式,并且使用了 o_append 标志,前面笔者给大家提到过,open 打开一个文件,默认的读写位置偏移量会处于文件头,但测试代码中使用了o_append 标志,如果 o_append 确实能生效的话,也就意味着调用 write 函数会从文件末尾开始写;代码中写入了 4 个字节数据,都是 0x55,之后,使用 lseek 函数将位置偏移量移动到距离文件末尾 4 个字节处,读取 4 个字节(也就是读取文件最后 4 个字节数据),之后将其打印出来,如果上面笔者的描述正确的话,打印出来的数据就是我们写入的数据,如果 o_append 不能生效,则打印出来数据就不会是 0x55,接下来编译测试:
总结:o_trunc和o_append标志,在特殊的情况下,使用起来非常方便,其中,使用了o_append标志后,即使通过lseek函数也是无法修改写文件的对应的偏移量的。


SMT生产线的未来已来:全自动智能智造设备一网打尽!
PIC单片机对步进电机的控制设计
浅谈嵌入式开发中测试用例的调试和测试方法
APP时代域名到底还重不重要
IEEE1394接口
Linux系统中O_APPEND和O_TRUNC标志的使用方法
大数据时代下企业如何实现数字化转型
5G 部署对物联网安全服务的需求增加
安森美半导体和ConvientPower Systems合作推出车载无线充电解决方案
日本要求新车标配自动制动,因为有很多高龄驾驶员
VC曝出了RTX 3090 HOF的PCB样板,26相供电
华为解禁谈判重启 G20特朗普为何“松口”?
谷歌向手机厂商发出警告 修改Android内核代码将暴露更多的安全Bug
郑州正方科技户外储能电站太阳能板充电实测
空调智能控制是通过是什么实现的?
预期2020年笔电出货量将达2亿台,2021年比今年再激增四成
基于STM32单片机SPWM逆变电源设计
各大公司都想要抓住“最后的互联网红利”?
5G促使CDN市场驶入高速发展轨道,“亏损换市场”仍是主流
高通孟樸:充分开发和利用各类频谱,全面释放5G潜能