第八次.ppt

上传人:b****2 文档编号:2648955 上传时间:2022-11-05 格式:PPT 页数:59 大小:1,010.50KB
下载 相关 举报
第八次.ppt_第1页
第1页 / 共59页
第八次.ppt_第2页
第2页 / 共59页
第八次.ppt_第3页
第3页 / 共59页
第八次.ppt_第4页
第4页 / 共59页
第八次.ppt_第5页
第5页 / 共59页
点击查看更多>>
下载资源
资源描述

第八次.ppt

《第八次.ppt》由会员分享,可在线阅读,更多相关《第八次.ppt(59页珍藏版)》请在冰豆网上搜索。

第八次.ppt

第5章嵌入式Linux应用程序开发5.1开发环境的建立5.2Linux及开发工具的使用5.3引导程序的移植5.4Linux操作系统的移植5.5应用程序的调试5.6综合训练:

建立嵌入式操作系统1Vi编辑器的使用1工作模式Vi是“Visualinterface”的简称,可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制。

Vi有三种基本工作模式:

命令行模式、文本输入模式和末行模式。

2工作模式命令行模式任何时候,不管用户处于何种模式,只要按一下键,即可使Vi进入命令行模式;我们在shell环境(提示符为$)下输入启动命令“vi”,进入编辑器时,也是处于该模式下。

在该模式下,用户可以输入各种合法的Vi命令,用于管理自己的文档。

此时从键盘上输入的任何字符都被当做编辑命令来解释,若输入的字符是合法的Vi命令,则Vi在接受用户命令之后完成相应的动作。

但需注意的是,所输入的命令并不在屏幕上显示出来。

若输入的字符不是Vi的合法命令,Vi会响铃报警。

文本输入模式在命令模式下输入插入命令i、附加命令a、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。

在该模式下,用户输入的任何字符都被Vi当做文件内容保存起来,并将其显示在屏幕上。

在文本输入过程中,若想回到命令模式下,按Esc键即可。

末行模式在命令模式下,用户按“:

”键即可进入末行模式下,此时Vi会在显示窗口的最后一行,显示一个“:

”作为末行模式的提示符,等待用户输入命令。

多数文件管理命令都是在此模式下执行的。

末行命令执行完后,Vi自动回到命令模式。

32进入在提示符“$”后键入Vi和想要编辑的文件名,便可进入Vi。

例如:

$viexample.c如果只键入Vi,而不带文件名,也可以进入Vi,之后在光标处键入文件内容。

进入Vi后,首先进入的就是命令模式,进入Vi时,用户不仅可以指定一个待编辑的文件名,而且还有许多附加操作。

如果希望在进入Vi之后,光标处于文件中特定的某行上,可在Vi后加上选项+n,其中n为指定的行数。

例如:

$vi+5example1.c43退出在命令模式中,连按两次大写字母Z,若当前编辑的文件曾被修改过,则Vi保存该文件后退出,返回到shell;若当前编辑的文件没被修改过,则Vi直接退出,返回到shell。

在末行模式下,输入命令:

:

wVi保存当前编辑文件,但并不退出,而是继续等待用户输入命令。

在使用w命令时,可以再给编辑文件起一个新的文件名。

:

wnewfile此时Vi将把当前文件的内容保存到指定的newfile中,而原有文件保持不变。

在末行模式下,输入命令:

:

q系统退出Vi返回到shell。

若在用此命令退出Vi时,编辑文件没有被保存,则Vi在显示窗口的最末行显示如下信息:

Nowritesincelastchange(use!

tooverrides)提示用户该文件被修改后没有保存,然后Vi并不退出,继续等待用户命令。

若用户就是不想保存被修改后的文件而要强行退出Vi时,可使用命令:

:

q!

5Linux下C语言编程1文件读写当需要打开一个文件进行读写操作的时候,可以使用系统调用函数open。

文件操作完成后,调用close函数关闭文件。

intopen(constchar*pathname,intflags);intopen(constchar*pathname,intflags,mode_tmode);intclose(intfd);open函数有两个形式,在此只介绍第一种方式。

其中pathname是我们要打开的文件名,包含路径名称,默认是在当前路径下。

Flags取值可以是下面的一个值或者是几个值的组合。

O_RDONLY:

以只读的方式打开文件;O_WRONLY:

以只写的方式打开文件;O_RDWR:

以读写的方式打开文件;O_APPEND:

以追加的方式打开文件;O_CREAT:

创建一个文件;要采用open的第二种形式;O_EXEC:

使用该选项时,如果使用了O_CREAT而且文件已经存在,就会发生一个错误;O_NOBLOCK:

以非阻塞的方式打开一个文件;O_TRUNC:

如果文件已经存在,则删除文件的内容。

如果打开文件成功,open会返回一个文件描述符。

以后对文件的所有操作就可以对这个文件描述符进行操作了。

当操作完成以后,要关闭文件时,只要调用close就可以了,其中fd是要关闭的文件描述符。

6文件打开后,就可以调用函数read和write进行文件的读写。

ssize_tread(intfd,void*buffer,size_tcount);ssize_twrite(intfd,constvoid*buffer,size_tcount);fd是要进行读写操作的文件描述符,buffer是要写入文件内容或读出文件内容的内存地址,count是要读写的字节数。

对于普通的文件,read从指定的文件(fd)中读取count个字节到buffer缓冲区中,同时返回count。

如果read读到了文件的结尾或者被一个信号所中断,返回值会小于count。

如果是由信号中断引起返回,而且没有读出数据,read会返回1,且设置errno为EINTR。

当程序读到了文件结尾的时候,read会返回0。

write从buffer中写count字节到文件fd中,成功时返回实际所写的字节数。

7#defineBUFFER_SIZE1024intmain(intargc,char*argv)intfrom_fd,to_fd;intbytes_read,bytes_write;charbufferBUFFER_SIZE;char*ptr;if(argc!

=3)fprintf(stderr,Usage:

%sfromfiletofilea,argv0);exit

(1);if(from_fd=open(argv1,O_RDONLY)=-1)fprintf(stderr,Open%sError:

%s,argv1,strerror(errno);exit

(1);if(to_fd=open(argv2,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)=-1)fprintf(stderr,Open%sError:

%s,argv2,strerror(errno);exit

(1);while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)if(bytes_read=-1)&(errno!

=EINTR)break;elseif(bytes_read0)ptr=buffer;while(bytes_write=write(to_fd,ptr,bytes_read)if(bytes_write=-1)&(errno!

=EINTR)break;elseif(bytes_write=bytes_read)break;elseif(bytes_write0)ptr+=bytes_write;bytes_read-=bytes_write;if(bytes_write=-1)break;close(from_fd);close(to_fd);exit(0);82文件属性文件具有各种各样的属性,除了上面提到的文件权限以外,文件还有创建时间、大小等属性。

有时候要判断文件是否可以进行某种操作,此时可以使用access函数。

intaccess(constchar*pathname,intmode);其中,pathname是文件名称,mode是所要判断的属性。

可以取以下值或者是其组合:

R_OK文件可以读;W_OK文件可以写;X_OK文件可以执行;F_OK文件存在。

当测试成功时,函数返回0;如果有一个条件不符时,返回1。

如果要获得文件的其他属性,可以使用函数stat或者fstat。

intstat(constchar*file_name,structstat*buf);intfstat(intfiledes,structstat*buf);structstatdev_tst_dev;/*设备*/ino_tst_ino;/*节点*/mode_tst_mode;/*模式*/nlink_tst_nlink;/*硬连接*/uid_tst_uid;/*用户ID*/gid_tst_gid;/*组ID*/dev_tst_rdev;/*设备类型*/off_tst_off;/*文件字节数*/unsignedlongst_blksize;/*块大小*/unsignedlongst_blocks;/*块数*/time_tst_atime;/*最后一次访问时间*/time_tst_mtime;/*最后一次修改时间*/time_tst_ctime;/*最后一次改变时间(指属性)*/;9stat用来判断没有打开的文件,而fstat用来判断打开的文件。

使用最多的属性一般是st_mode,通过该属性可以判断给定的文件是一个普通文件,还是一个目录或者连接。

可以使用下面几个宏来判断:

S_ISLNK(st_mode),是否是一个连接;S_ISREG,是否是一个常规文件;S_ISDIR,是否是一个目录;S_ISCHR,是否是一个字符设备;S_ISBLK,是否是一个块设备;S_ISFIFO,是否是一个FIFO文件;S_ISSOCK,是否是一个SOCKET文件。

103目录文件的操作在编写程序的时候,有时候想得到当前的工作路径。

C库函数提供了getcwd来解决这个问题:

char*getcwd(char*buffer,size_tsize);如果提供一个size大小的buffer,getcwd会把当前的路径拷贝到buffer中,如果buffer太小,函数会返回1和一个错误号。

Linux提供了大量的目录操作函数,下面列出了几个比较简单和常用的函数:

intmkdir(constchar*path,mode_tmode);DIR*opendir(constchar*path);structdirent*readdir(DIR*dir);voidrewinddir(DIR*dir);intclosedir(DIR*dir);mkdir就是创建一个目录,opendir打开一个目录为以后读做准备,readdir读一个打开的目录,rewinddir是用来重读目录的,closedir是关闭一个目录。

11下面的程序有一个输入参数,如果这个参数是一个文件名,输出这个文件的大小和最后修改的时间;如果是一个目录,输出这个目录下所有文件的大小和修改时间。

staticintget_file_size_time(constchar*filename)structstatstatbuf;if(stat(filename,&statbuf)=-1)printf(Getstaton%sError:

%s,filename,strerror(errno);return(-1);if(S_ISDIR(statbuf.st_mode)return

(1);if(S_ISREG(statbuf.st_mode)printf(%ssize:

%ldbytesmodifiedat%s,filename,statbuf.st_size,ctime(&statbuf.st_mtime);return(0);intmain(intargc,char*argv)DIR*dirp;structdirent*direntp;intstats;if(argc!

=2)printf(Usage:

%sfilenamea,argv0);exit

(1);if(stats=get_file_size_time(argv1)=0)|(stats=-1)exit

(1);if(dirp=opendir(argv1)=NULL)printf(OpenDirectory%sError:

%s,argv1,strerror(errno);exit

(1);while(direntp=readdir(dirp)!

=NULL)if(get_file_size_time(direntp-closedir(d

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1