《嵌入式Linux文件编程.pdf》由会员分享,可在线阅读,更多相关《嵌入式Linux文件编程.pdf(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、版权声明:本课件及其印刷物、视频的版权归成都国嵌信息技术有限公司所有,并保留所有权力:任何单版权声明:本课件及其印刷物、视频的版权归成都国嵌信息技术有限公司所有,并保留所有权力:任何单位或个人未经成都国嵌信息技术有限公司书面授权,不得使用该课件及其印刷物、视频从事商业、教学活位或个人未经成都国嵌信息技术有限公司书面授权,不得使用该课件及其印刷物、视频从事商业、教学活动。已经取得书面授权的,应在授权范围内使用,并注明动。已经取得书面授权的,应在授权范围内使用,并注明“来源:国嵌来源:国嵌”。违反上述声明者,我们将追究其。违反上述声明者,我们将追究其法律责任。法律责任。LINUX文件、时间编程文件
2、、时间编程嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116Contents系统调系统调用用-文件文件访问访问库函数库函数-文件文件访问访问时间编程时间编程嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116Contents系统调系统调用用-文件文件访问访问库函数库函数-文件文件访问访问时间编程时间编程嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116文件编程
3、文件编程Linux中文件编程可以使用两种方法:中文件编程可以使用两种方法:vLinux系统调系统调用用vC语言库函数语言库函数前者依赖于前者依赖于Linux系统,后者与操作系统是独立系统,后者与操作系统是独立的,在任何操作系统下,使用的,在任何操作系统下,使用C语言库函数操作语言库函数操作文件的方法都是相同的。文件的方法都是相同的。嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116系统调用系统调用-创建创建int creat(const char*filename,mode_t mode)vfilename:要创建
4、的文件名要创建的文件名(包含路径,缺省为当包含路径,缺省为当前路径前路径)vmode:创建模式创建模式嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116系统调用系统调用-创建创建常见创建模式:常见创建模式:S_IRUSR 可读可读S_IWUSR 可写可写S_IXUSR 可执行可执行S_IRWXU 可读、写、执行可读、写、执行嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116系统调用系统调用-创建创建除了可以使用上述宏以外,还可以直接除了
5、可以使用上述宏以外,还可以直接使用数字来表示文件的访问权限:使用数字来表示文件的访问权限:v可执行可执行-1v可写可写-2v可读可读-4v上述值的和,如可写可读上述值的和,如可写可读-6v无任何权限无任何权限-嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116实例分析(演示)实例分析(演示)file_嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116文件描述文件描述在在Linux系统中,所有打开的文件都对应一个系统中,所有打开的文件都对
6、应一个文件文件描描述述符符。文件描述符的本质是一个。文件描述符的本质是一个非负整非负整数数。当打开一个文件时,该整数由系统来分。当打开一个文件时,该整数由系统来分配。文件描述符的范围是配。文件描述符的范围是0-OPEN_MAX。早期的早期的UNIX版本版本OPEN_MAX=19,即允许每,即允许每个进程同时打开个进程同时打开20个文件,现在很多系统则将个文件,现在很多系统则将其增加至其增加至1024。嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116系统调用系统调用-打开打开vint open(const char
7、*pathname,int flags)vint open(const char*pathname,int flags,mode_t mode)pathname:要打开的文件名:要打开的文件名(包含路径,缺省为当包含路径,缺省为当前路径前路径)flags:打开标志:打开标志嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116系统调用系统调用-打开打开常见常见的的打开打开标志标志:O_RDONLY 只读方式打开只读方式打开O_WRONLY 只写方式打开只写方式打开O_RDWR 读写方式打开读写方式打开O_APPEND
8、追加方式打开追加方式打开O_CREAT 创建一个文件创建一个文件O_NOBLOCK 非阻塞方式打开非阻塞方式打开嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116系统调用系统调用-打开打开如果使用了如果使用了O_CREATE标志,则使用的函数是:标志,则使用的函数是:int open(const char*pathname,int flags,mode_t mode);这时需要指定这时需要指定mode来表示文件的访问权限。来表示文件的访问权限。嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式
9、嵌入式Linux学习学习交流交流QQ群群:65212116file_open.c实例分析(演示)实例分析(演示)嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116系统调用系统调用-关闭关闭当我们操作完文件以后当我们操作完文件以后,需要关闭文需要关闭文件:件:int close(int fd)fd:文件描述符,来源?文件描述符,来源?嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116系统调用系统调用-读读int read(int fd,c
10、onst void*buf,size_t length)功能:功能:从文件描述符从文件描述符fd所所指定指定的文件的文件中中读读取取length个个字字节节到到buf所所指向指向的的缓冲区缓冲区中,中,返回值为实际读取的字节数。返回值为实际读取的字节数。嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116系统调用系统调用-写写int write(int fd,const void*buf,size_t length)功能:功能:把把length个个字字节节从从buf指向指向的的缓冲区缓冲区中写中写到文件描述符到文件描
11、述符fd所所指向指向的文件的文件中,返回中,返回值为实际写入的字节数。值为实际写入的字节数。嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116系统调用系统调用-定位定位int lseek(int fd,offset_t offset,int whence)功能:功能:将文件读写指针相对将文件读写指针相对whence移动移动offset个个字字节节。操作成功时,返回文件指针相。操作成功时,返回文件指针相对于文件头的位置。对于文件头的位置。嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式L
12、inux学习学习交流交流QQ群群:65212116系统调用系统调用-定位定位whence可使用下述值:可使用下述值:SEEK_SET:相对文件开头:相对文件开头SEEK_CUR:相对文件读写指针的当前位置:相对文件读写指针的当前位置SEEK_END:相对文件末尾:相对文件末尾offset可取可取负值负值,表示向前移动。例如下述调用,表示向前移动。例如下述调用可将文件指针相对当前位置可将文件指针相对当前位置向向前前移动移动5个字节:个字节:lseek(fd,-5,SEEK_CUR)嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:6
13、5212116如何利用如何利用lseek来计算文件长度?来计算文件长度?系统调用系统调用-定位定位嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116由于由于lseek函数的返回值为文件指针相对函数的返回值为文件指针相对于文件头的位置,因此下面调用的返回于文件头的位置,因此下面调用的返回值就是文件的长度:值就是文件的长度:lseek(fd,0,SEEK_END)系统调用系统调用-定位定位嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116系
14、统调用系统调用-访问判断访问判断有时我们需要判断文件是否可以进行某种操作有时我们需要判断文件是否可以进行某种操作(读读,写写等等),这时可以使用,这时可以使用access函数:函数:int access(const char*pathname,int mode)pathname:文件名称文件名称mode:要判断的访问权限。可以取以下值或者是他们的要判断的访问权限。可以取以下值或者是他们的组合。组合。R_OK:文件可读,:文件可读,W_OK:文件可写,:文件可写,X_OK:文件可执行,:文件可执行,F_OK文件存在。文件存在。返回返回值值:当我们测试成功时当我们测试成功时,函数返回函数返回0,否
15、则如果一个条否则如果一个条件不符时件不符时,返回返回-1。嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116例:例:#includeint main()if(access(“/etc/passwd”,R_OK)=0)printf(“/etc/passwd can be read!n”);系统调用系统调用-访问判断访问判断嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116综合实例(演示)综合实例(演示)file_嵌入式嵌入式Linux技术
16、咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116Contents系统调系统调用用-文件文件访问访问库函数库函数-文件文件访问访问时间编程时间编程嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116库函数库函数C库函数的文件操作是独立于具体的操作库函数的文件操作是独立于具体的操作系统平台的,不管是在系统平台的,不管是在DOS、Windows、Linux还是在还是在VxWorks中都是这些函数。中都是这些函数。嵌入式嵌入式Linux技术咨询技术咨询QQ号号:5504
17、91596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116库函数库函数-创建和打开创建和打开FILE*fopen(const char*filename,const char*mode)vfilename:打开的文件名打开的文件名(包含路径,缺省为当前路径包含路径,缺省为当前路径)vmode:打开模式打开模式嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116常见打开模式:常见打开模式:v r,rb 只读方式打开只读方式打开v w,wb 只写方式打开,如果文件不存在,则创建该文件只写方式打开,如果文件
18、不存在,则创建该文件v a,ab 追加方式打开,如果文件不存 在,则创建该文件追加方式打开,如果文件不存 在,则创建该文件v r+,r+b,rb+读写方式打开读写方式打开v w+,w+b,wh+读写方式打开,如果文件不存在,则创建该文读写方式打开,如果文件不存在,则创建该文件件v a+,a+b,ab+读和追加方式打开。如果文件不存在,则创读和追加方式打开。如果文件不存在,则创建该文件建该文件库函数库函数-创建和打开创建和打开嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116库函数库函数-创建和打开创建和打开b用于区
19、分二进制文件和文本文件,这一点用于区分二进制文件和文本文件,这一点在在DOS、Windows系统中是有区分的,但系统中是有区分的,但Linux不区分二进制文件和文本文件。不区分二进制文件和文本文件。嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116库函数库函数-读读size_t fread(void*ptr,size_t size,size_t n,FILE*stream)功能:功能:从从stream指向的文件中读取指向的文件中读取n个字段,每个个字段,每个字段为字段为size字节,并将读取的数据放入字节,并将读取
20、的数据放入ptr所指的字符数组中,返回实际已读取的字所指的字符数组中,返回实际已读取的字节数。节数。嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116库函数库函数-写写size_t fwrite(const void*ptr,size_t size,size_t n,FILE*stream)功能:功能:从缓冲区从缓冲区ptr所指的数组中把所指的数组中把n个字段写到个字段写到stream指向的文件中,每个字段长为指向的文件中,每个字段长为size个字节,返回实际写入的字段数。个字节,返回实际写入的字段数。嵌入式嵌入式
21、Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116库函数库函数-读字符读字符int fgetc(FILE*stream)从指定的文件中读一个字符从指定的文件中读一个字符#include main()FILE*fp;char ch;if(fp=fopen(c1.txt,rt)=NULL)printf(nCannot open file strike any key exit!);getch();exit(1);ch=fgetc(fp);while(ch!=EOF)putchar(ch);ch=fgetc(fp);fclose(f
22、p);嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116int fputc(int c,FILE*stream)向指定的文件中写入一个字符向指定的文件中写入一个字符#include main()FILE*fp;char ch;if(fp=fopen(string,wt+)=NULL)printf(Cannot open file,strike any key exit!);getch();exit(1);printf(input a string:n);ch=getchar();while(ch!=n)fputc(
23、ch,fp);ch=getchar();printf(n);fclose(fp);库函数库函数-写字符写字符嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116库函数库函数-格式化读格式化读fscanf(FILE*stream,char*format,argument.)从一个流中进行格式化输入从一个流中进行格式化输入#include#include int main(void)int i;printf(Input an integer:);if(fscanf(stdin,%d,&i)printf(The integ
24、er read was:%in,i);return 0;嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116库函数库函数-格式化写格式化写int fprintf(FILE*stream,char*format,argument,.)格式化输出到一个流中格式化输出到一个流中#include#include FILE*stream;void main(void)int i=10;double fp=1.5;char s=this is a string;char c=n;stream=fopen(fprintf.out,
25、w);fprintf(stream,%s%c,s,c);fprintf(stream,%dn,i);fprintf(stream,%fn,fp);fclose(stream);嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116库函数库函数-定位定位int fseek(FILE*stream,long offset,int whence)whence:SEEK_SET 从文件的开始处开始搜索从文件的开始处开始搜索SEEK_CUR 从当前位置开始搜索从当前位置开始搜索SEEK_END 从文件的结束处开始搜索从文件的结束
26、处开始搜索嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116路径获取路径获取在编写程序的时候,有时候需要得到当在编写程序的时候,有时候需要得到当前路径。前路径。C库函数提供了库函数提供了getcwd来解决来解决这个问题。这个问题。char*getcwd(char*buffer,size_t size)我们提供一个我们提供一个size大小的大小的buffer,getcwd会把当前的路径名会把当前的路径名copy 到到buffer中中.如果如果buffer太小太小,函数会返回函数会返回-1。嵌入式嵌入式Linux技术咨
27、询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116路径获取路径获取#includemain()char buf80;getcwd(buf,sizeof(buf);printf(“current working directory:%sn”,buf);嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116创建目录创建目录#include int mkdir(char*dir,int mode)功能:创建一个新目录。功能:创建一个新目录。返回值:返回值:0表示成功,表示成
28、功,-1表述出错。表述出错。嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116实验一实验一使用库函数实现使用库函数实现file_cp的功能的功能嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116Contents系统调系统调用用-文件文件访问访问库函数库函数-文件文件访问访问时间编程时间编程嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116时间类型时间类型vC
29、oordinated Universal Time(UTC):世界标):世界标准时间,也就是大家所熟知的准时间,也就是大家所熟知的格格林威治林威治标标准准时间时间(Greenwich Mean Time,GMT)。)。v Calendar Time:日历日历时间时间,是用,是用“从一个标准从一个标准时间点(如:时间点(如:1970年年1月月1日日0点)到此时经过的点)到此时经过的秒数秒数”来表示的时间。来表示的时间。嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116时间获取时间获取#include time_t t
30、ime(time_t*tloc)功能:获取日历时间,即从功能:获取日历时间,即从1970年年1月月1日日0点到现在所经历的秒数。点到现在所经历的秒数。/*typedef long time_t*/嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116v struct tm*gmtime(const time_t*timep)功能:将日历时间转化为功能:将日历时间转化为格格林威治林威治标标准准时间,时间,并保并保存至存至TM结构。结构。v struct tm*localtime(const time_t*timep)功能
31、:将日历时间转化为功能:将日历时间转化为本本地地时间,时间,并保存至并保存至TM结结构。构。时间转化时间转化嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116时间保存时间保存struct tm int tm_sec;/秒值秒值int tm_min;/分钟值分钟值int tm_hour;/小时值小时值int tm_mday;/本月第几日本月第几日int tm_mon;/本年第几月本年第几月int tm_year;/tm_year+1900=哪一年哪一年int tm_wday;/本周第几日本周第几日int tm_yda
32、y;/本年第几日本年第几日int tm_isdst;/日光节约时间日光节约时间;嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116时间获取时间获取例例:time1.c(演示)(演示)#include#include int main(void)struct tm*local;time_t t;t=time(NULL);local=localtime(&t);printf(Local hour is:%dn,local-tm_hour);local=gmtime(&t);printf(UTC hour is:%dn,
33、local-tm_hour);return 0;嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116时间显示时间显示vchar*asctime(const struct tm*tm)功能:将功能:将tm格式的时间转化为字符串,如:格式的时间转化为字符串,如:Sat Jul 30 08:43:03 2005vchar*ctime(const time_t*timep)功能:将日历时间转化为功能:将日历时间转化为本本地地时间的时间的字符字符串形串形式式。嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌
34、入式嵌入式Linux学习学习交流交流QQ群群:65212116时间显示时间显示例例:time2.c(演示演示)#include#include int main(void)struct tm*ptr;time_t lt;lt=time(NULL);ptr=gmtime(<);printf(asctime(ptr);printf(ctime(<);return 0;嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116获取时间获取时间int gettimeofday(struct timeval*tv,struc
35、t timezone*tz)功能:获取从今日凌晨到现在的时间差,常用于计功能:获取从今日凌晨到现在的时间差,常用于计算事件耗时。算事件耗时。struct timeval int tv_sec;/秒数秒数int tv_usec;/微妙数微妙数;嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116实例分析(演示)实例分析(演示)T嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116延时执行延时执行vunsigned int sleep(unsigned int seconds)功能:使程序睡眠功能:使程序睡眠seconds秒。秒。vvoid usleep(unsigned long usec)功能:使程序睡眠功能:使程序睡眠usec微秒。微秒。嵌入式嵌入式Linux技术咨询技术咨询QQ号号:550491596嵌入式嵌入式Linux学习学习交流交流QQ群群:65212116实验二实验二获取本地时间,以字符获取本地时间,以字符串方式显示串方式显示