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

简介: 大家好! 今天主要和大家聊一聊,open函数的的flags标志,譬如​:O_APPEND和O_TRUNC标志的使用方法。

8635abdb772613d38a89cfe388ff2c61.png

第一:O_TRUNC标志使用方法

      使用该标志O_TRUNC的时候,调用open函数打开文件的时候会将文件原本的内容全部丢弃,文件大小变为0;下面对文件的操作代码如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#icclude <stdlib.h>
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标志打开该文件,代码中仅仅只是打开文件,并没有对其进行读写操作,接下来编译运行来看看测试结果;

a6246d3a27699302e6844c0684d53b12.png

第二:O_APPEND使用方法

   接下来聊一聊,使用O_APPEND标志方法,如果open函数携带并使用了O_APPEND标志,调用open函数打开文件,当每次使用write()函数对文件进行读写操作时,都会自动把文件当前位置偏移量移动到文件末尾,从文件末尾开始写入数据,也就是意味着每次写入数据都是从文件末尾开始。这里我们直接进行测试,测试代码如下所示:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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\n", 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,接下来编译测试:

5651d9af4d6a7020783fd26173084f8a.png

总结:O_TRUNC和O_APPEND标志,在特殊的情况下,使用起来非常方便,其中,使用了O_APPEND标志后,即使通过lseek函数也是无法修改写文件的对应的偏移量的。

目录
相关文章
|
9月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
831 3
Linux系统禁用swap
|
9月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
1407 3
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
899 3
Linux系统初始化脚本
|
10月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
665 18
|
9月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
1052 1
|
9月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1354 1
|
10月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
2521 10
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
545 1
|
Linux 调度 数据库
Linux下的系统编程——线程同步(十三)
Linux下的系统编程——线程同步(十三)
360 0
Linux下的系统编程——线程同步(十三)
|
存储 Linux 调度
Linux系统编程 多线程基础
Linux系统编程 多线程基础
215 1