原型:

#include <unistd.h>
#include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ );

功能: 改变已经打开文件的性质

常见使用方式:

int fcntl(int fd, int cmd);

int fcntl(int fd, int cmd, long arg);

int fcntl(int fd, int cmd, struct flock*lock);

*复制一个已有的文件描述符,新文件描述符作为函数返回值(cmd=F_DUPFD)

*获得/设置文件描述符标志(cmd=F_GETFD或F_SETFD)

*获得/设置文件状态标志(cmd=F_GETFL或F_SETFL)

通过第三个参数来设置

  可以更改的几个标志是O_APPEND、O_NONBLOCK、SYNC、O_ASYNC,

  而O_RDONLY、O_WRONLY、O_RDWR不适用(只读状态标志、只写状态标志、读写状态标志,不可以更改,这些只能是在文件进行open的时候设置的哦!)

*获得/设置文件锁(cmd=F_SETLK、cmd=F_GETLK、F_SETLKW)

文件状态标志设置案例,实验

实验思路:使用int open(const char *pathname, int flags);

打开文件描述符的时候,flag先设置为O_WRONLY, 再使用set_fl追加O_APPEND文件状态标志,然后写入文件内容观察效果,作为实验1。

在实验1的set_fl后方再次调用clr_fl(fd, O_APPEND)清除O_APPEND文件状态标志,然后写入文件内容观察效果,作为实验2。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h> void set_fl(int fd, int flag){ int val = fcntl(fd, F_GETFL);
val |= flag; if( fcntl(fd, F_SETFL, val) <0 ){
fprintf(stderr, "fcntl error:%s \n ", strerror(errno));
}
} void clr_fl(int fd, int flag){ int val = fcntl(fd, F_GETFL);
val &= ~flag; if( fcntl(fd, F_SETFL, val) <0 ){
perror("fcntl error: ");
}
} int main()
{
printf(".. \n");
int fd = open("tmp.txt", O_WRONLY | O_CREAT); unsigned char buff1[] = "hello-";
unsigned char buff2[] = "jack\n"; ssize_t writebytes = -1;
writebytes = write(fd, buff1, sizeof(buff1));
printf("writebytes:[%ld] bytes .. \n", writebytes); set_fl(fd, O_APPEND); writebytes = write(fd, buff2, sizeof(buff2));
printf("writebytes:[%ld] bytes .. \n", writebytes); return 0;
}

实验结果:

解析:

第1次./ab执行,cat显示“hello-jack”,这个应该没有疑惑。

第2次./ab执行,之前的tmp.txt内已经存在文本“hello-jack”。

第2次./ab内的第一次write,文件读写指针是从头开始的,所以覆写了前面的“hello-” 。(注意,这里所谓覆写,即覆盖写入了一次,所以肉眼观察不到)

第二次write之前,使用set_fl追加了O_APPEND文件标志,所以文件读写指针偏移到了文件末尾,在文件末尾进行了一次write,使得文件末尾多出了“jack”文本内容。

第3次./ab执行,原理同上。

将上述实验代码内的set_fl(fd, O_APPEND) 修改为 clr_fl(fd, O_APPEND), 则每次执行,tmp.txt内的内容都是“hello-jack”。

.

系统编程-文件IO-fcntl系统调用的更多相关文章

  1. linux系统编程--文件IO

    系统调用 什么是系统调用: 由操作系统实现并提供给外部应用程序的编程接口.(Application Programming Interface,API).是应用程序同系统之间数据交互的桥梁. C标准函 ...

  2. Linux系统编程--文件IO操作

    Linux思想即,Linux系统下一切皆文件. 一.对文件操作的几个函数 1.打开文件open函数 int open(const char *path, int oflags); int open(c ...

  3. 系统编程--文件IO

    1.文件描述符 文件描述符是一个非负整数,当打开一个现有文件或创建一个新文件时候,内核向进程返回一个文件描述符,新打开文件返回文件描述符表中未使用的最小文件描述符.Unix系统shell使用文件描述符 ...

  4. Linux C高级编程——文件操作之系统调用

    Linux C高级编程文件操作之系统调用 宗旨:技术的学习是有限的,分享的精神是无限的.           库函数是一些完毕特定功能的函数.一般由某个标准组织制作公布,并形成一定的标准.使用库函数编 ...

  5. 系统编程-文件IO-IO处理方式

    IO处理五种模型 .

  6. Linux系统编程@文件操作(一)

    只总结了部分常用的内容,详细内容参考<UNIX环境高级编程>及相关书籍. Linux中文件编程可以使用两种方法 Linux系统调用(依赖于系统) C语言库函数(不依赖于系统) Linux系 ...

  7. linux系统编程:IO读写过程的原子性操作实验

    所谓原子性操作指的是:内核保证某系统调用中的所有步骤(操作)作为独立操作而一次性加以执行,其间不会被其他进程或线程所中断. 举个通俗点的例子:你和女朋友OOXX的时候,突然来了个电话,势必会打断你们高 ...

  8. Linux系统编程--文件描述符的复制dup()和dup2()【转】

    本文转载自:http://blog.csdn.net/tennysonsky/article/details/45870459 dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个 ...

  9. Linux系统编程@终端IO

    Linux系统中终端设备种类  终端是一种字符型设备,有多种类型,通常使用tty 来简称各种类型的终端设备.终端特殊设备文件一般有以下几种: 串行端口终端(/dev/ttySn ) ,伪终端(/dev ...

  10. 六、文件IO——fcntl 函数 和 ioctl 函数

    6.1 fcntl 函数 6.1.1 函数介绍 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd ...

随机推荐

  1. locust多进程实现分布式压测遇到的问题

    多进程分布式的实现: locust分布式时,需借助命令locust 一个一个启动worker,在使用中有点繁琐, 下面借助于多进程,按既定worker数量,一键启动: from locust impo ...

  2. 初读Nginx

    Nginx反向代理:将前端发送的动态请求由Nginx转发到后端服务器 NGINX的好处: 可以缓存,提高访问速度 负载均衡:当请求量过大时,可以按指定方式均衡的分配给集群中的每台服务器 保证后端服务安 ...

  3. ORACLE PL/SQL 对象、表数据对比功能存储过程简单实现

    最近帮忙跟进个oracle11g upgrade 升级到19c 的项目,由于业主方不太熟悉oracle upgrade相关升级流程,以及升级影响范围相关的事项,担心应用停机升级以后会导致数据库保存的业 ...

  4. Mac端MySQL安装教程

    Mac端: 1.安装 **        首先进入官网:**https://dev.mysql.com/downloads/mysql/ 根据自身情况是M系列芯片(ARM版)还是Intel系列芯片(x ...

  5. hive导入mysql

    hive测试--HIVE数据分析02 题目: 4.处理结果入库:(在虚拟机安装mysql)    将上述统计分析的结果数据保存到mySQL数据库中. #text3_1入库 #1.添加驱动,在hive的 ...

  6. 【Java】匿名表达式 + 构造块

    来源自同事的一个代码截图 可以看见最后一行装填HashMap的语法非常的不常见 在我整理思绪之后才明白这语法是使用了 匿名内部类 + 对象构造代码块 一般使用场景是发生在容器对象的创建上,因为有些时候 ...

  7. 基于浅层神经网络(全连接网络)的强化学习算法(Reinforce) 在训练过程中出现梯度衰退(degenerate)的现象

    首先给出一个代码地址: https://gitee.com/devilmaycry812839668/CartPole-PolicyNetwork 强化学习中的策略网络算法.<TensorFlo ...

  8. 【转载】手动DIY制作机械臂

    相关链接: https://news.cnblogs.com/n/703664/ https://www.bilibili.com/video/BV12341117rG https://www.cnb ...

  9. 关于mysql配置文件中jdbc url 的记录

    版本不同 url不同 大同小异 基本就是不同参数配置的区别 maven 仓库地址 https://mvnrepository.com/artifact/mysql/mysql-connector-ja ...

  10. VisionOn:新一代在线制图工具,简单易用又高颜值

    Vision On 一款集流程图.思维导图.白板于一体的轻量级在线图形工具 在工作和学习过程中,通过可视化的图形,有助于清晰高效地表达我们的灵感.想法.思想. 工欲善其事,必先利其器. 目前,思维导图 ...