系统编程-文件IO-fcntl系统调用
原型:
#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系统调用的更多相关文章
- linux系统编程--文件IO
系统调用 什么是系统调用: 由操作系统实现并提供给外部应用程序的编程接口.(Application Programming Interface,API).是应用程序同系统之间数据交互的桥梁. C标准函 ...
- Linux系统编程--文件IO操作
Linux思想即,Linux系统下一切皆文件. 一.对文件操作的几个函数 1.打开文件open函数 int open(const char *path, int oflags); int open(c ...
- 系统编程--文件IO
1.文件描述符 文件描述符是一个非负整数,当打开一个现有文件或创建一个新文件时候,内核向进程返回一个文件描述符,新打开文件返回文件描述符表中未使用的最小文件描述符.Unix系统shell使用文件描述符 ...
- Linux C高级编程——文件操作之系统调用
Linux C高级编程文件操作之系统调用 宗旨:技术的学习是有限的,分享的精神是无限的. 库函数是一些完毕特定功能的函数.一般由某个标准组织制作公布,并形成一定的标准.使用库函数编 ...
- 系统编程-文件IO-IO处理方式
IO处理五种模型 .
- Linux系统编程@文件操作(一)
只总结了部分常用的内容,详细内容参考<UNIX环境高级编程>及相关书籍. Linux中文件编程可以使用两种方法 Linux系统调用(依赖于系统) C语言库函数(不依赖于系统) Linux系 ...
- linux系统编程:IO读写过程的原子性操作实验
所谓原子性操作指的是:内核保证某系统调用中的所有步骤(操作)作为独立操作而一次性加以执行,其间不会被其他进程或线程所中断. 举个通俗点的例子:你和女朋友OOXX的时候,突然来了个电话,势必会打断你们高 ...
- Linux系统编程--文件描述符的复制dup()和dup2()【转】
本文转载自:http://blog.csdn.net/tennysonsky/article/details/45870459 dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个 ...
- Linux系统编程@终端IO
Linux系统中终端设备种类 终端是一种字符型设备,有多种类型,通常使用tty 来简称各种类型的终端设备.终端特殊设备文件一般有以下几种: 串行端口终端(/dev/ttySn ) ,伪终端(/dev ...
- 六、文件IO——fcntl 函数 和 ioctl 函数
6.1 fcntl 函数 6.1.1 函数介绍 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd ...
随机推荐
- Python 实现Excel和TXT文本格式之间的相互转换
Excel是一种具有强大的数据处理和图表制作功能的电子表格文件,而TXT则是一种简单通用.易于编辑的纯文本文件.将Excel转换为TXT可以帮助我们将复杂的数据表格以文本的形式保存,方便其他程序读取和 ...
- .NET TCP、UDP、Socket、WebSocket
做.NET应用开发肯定会用到网络通信,而进程间通信是客户端开发使用频率较高的场景. 进程间通信方式主要有命名管道.消息队列.共享内存.Socket通信,个人使用最多的是Sokcet相关. 而Socke ...
- 基于Drone实现CI/CD【0到1架构系列】
CI/CD是持续性集交和持续性部署,简单来讲就是自动化构建和自动化部署.目前有很多集成方案,也有很多组装方案,只要能实现自动化构建出制品,再自动部署到生产环境就行. 目前很多源代码都集成了CI/CD功 ...
- Java解压rar5兼容rar4
RAR文件格式由WinRAR开发,广泛用于文件压缩和归档.随着技术的发展,RAR5作为更新的版本,引入了多项改进以提高压缩效率和数据安全性. 压缩效率:RAR5通过增大字典大小至32MB,相较于RAR ...
- Jmeter函数助手40-escapeHtml
escapeHtml函数用于将字符串进行HTML转义. 字符串转义:填入字符串 1.escapeHtml函数是将字符换进行HTML转义,jmeter还存在其它格式化函数如urlencode函数,url ...
- SpringBoot 配置统一API对象返回
1.前言 在实际项目开发中,为了便于前端进行响应处理,需要统一返回类格式.特别是在有多个后端开发人员参与的情况下,如果不规范返回类,每个人按照个人习惯返回数据,前端将面临各式各样的返回数据,难以统一处 ...
- 深度学习框架theano下的batch_norm实现代码——强化学习框架rllab
深度学习框架theano下的batch_norm实现代码--强化学习框架rllab # encoding: utf-8 import lasagne.layers as L import lasagn ...
- 强化学习、分布式计算方向的phd毕业后去企业的要求
实验室慕师弟马上要phd毕业了,虽然我是遥遥无期,但是看到身边同学可以上岸还是提师弟高兴.由于师弟准备去企业工作,于是乎我也不免好奇起来phd毕业后去公司会有什么样的要求,于是网上找了找招聘信息,挑了 ...
- 如何拉取指定CPU架构并且指定ubuntu版本并且指定cuda和cudnn版本的docker镜像
本篇讲的重点是如何拉取带有cuda和cudnn的docker镜像,因此这些的镜像源的频道为NVIDIA: 官方地址: https://hub.docker.com/r/nvidia/cuda 根据官方 ...
- 从baselines库的common/vec_env/vec_normalize.py模块看方差的近似计算方法
在baselines库的common/vec_env/vec_normalize.py中计算方差的调用方法为: RunningMeanStd 同时该计算函数的解释也一并给出了: https://en. ...