APUE练习------fcntl函数的使用

引言:在linux的文件i/o函数中在打开一个文件的时候,在不关闭文件的前提下,追加写入内容是一个很常见的操作
fcntl就是这样子的一个函数,当然他的功能可不止这些。

fcntl函数的详细说明

函数格式:
int fcntl(int fd ,int cmd ,…/arg/)
该函数是一个变参函数,但是fd和cmd是必须要有的,而后面的参数取决于cmd指令,arg常为int型
fd:文件描述符
cmd:传入的指令(一会儿详细说明)
返回值:
-1 函数执行失败(可用perror来查看具体错误原因)
取决于传入的cmd,cmd不同返回值不同,但是基本上是非零int类型

具体的fcntl函数说明可以查询man文档(原文800多页,我这只是冰山一角,如有错误还望见谅)

函数案例

以只写方式打开一个文件,然后在文件中写内容会删除原来的内容,用fcntl改变文件描述符的状态(追加写),查看文件是否被删除

代码

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>




int main(int argc,char* argv[]){
	//判断输入格式
	if(argc < 2){
	printf("./a.out filename mode");
	exit(1);
	}
	//打开文件
	int fd = open(argv[1],O_CREAT|O_WRONLY,777);
	if( fd == -1 ){
	perror("openfile");
	exit(1);
	}
	//获取当前文件状态描述符
	int flag = fcntl(fd,F_GETFL,0);
	//打印未修改的时候文件状态描述符
	printf("file flag is %d\n",flag);
	
		
	//向文件中写内容---->此时会覆盖文件的原有内容
	//因为只有一个文件指针,而且是只写打开,故会从头开始写
	
	char buf[512]={"hello world \n"};
	int count=write(fd,buf,sizeof(buf));
	printf("has write %d\n",count);
	//追加写操作
	flag |= O_APPEND; 
	//改变文件状态描述符
	int flg=fcntl(fd,F_SETFL,0);
 	
	//判断是否成功更改
	if(flg == -1){
	perror("f_setfl");
	exit(1);
	}	
	printf("==============now  file flag has been changed==================\n");
	//写文件
	char buf2[512]={"file flag has been changed \n "};	
	int count1=write(fd,buf2,sizeof(buf2));	
	//打印添加追加写后文件状态描述符
	printf("file flag is %d\n",flag);
	printf("has write %d\n",count);
	//关闭文件
	close(fd);
	return 0;
}

运行结果

未追加在这里插入图片描述
添加追加写
在这里插入图片描述

单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。这正符合了现代时钟的设计要求。数字钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字时钟及扩大其应用,有着非常现实的意义。因此本论文所做的数字时钟采用了以单片机(STC89C51)为核心,结合相关的外围元器件例如液晶显示、按键电路、复位电路、闹钟电路,再配以相应的软件,达到制作简易数字钟的目的,能实现实时时钟显示的功能,能进行年、月、日、时、分、秒和实时温度的显示,并且通过蓝牙模块实现两台单片机的通信功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值