上嵌linux系统编程之一_第1页
上嵌linux系统编程之一_第2页
上嵌linux系统编程之一_第3页
上嵌linux系统编程之一_第4页
上嵌linux系统编程之一_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、系列课程Linux系统编程第三章系统I/O讲师:课前提问标准文件I/O和文件I/O文件I/O常见函数有哪些?文件读写方式有哪些?常见的目录操作函数有哪些 ?区别?本章内容1.1 Unix文件基础1.2 I/O相关的操作函数1.3 文件属性操作函数1.4 目录操作相关函数1.5 其他文件相关操作本章目标了解Unix文件基础理解相关的操作函数文件属性操作函数目录操作相关函数其他文件相关操作第一节Unix文件基础Unix文件基础-进程和程序程序(静态)存放在磁盘文件中的可执行文件通过exec函数族调用运行进程(动态)程序的执行实例进程的标识(,p,)进程控制fork()exec函数族wait()/w

2、ait()Unix文件基础-出错处理全局错误码errno在errno.h中定义,全局可见错误值定义为“E”形式,如EACS处理规则如果没有出错,则errno值不会被一个例程清除,即只有出错时,才需要检查errno值任何函数都不会将errno值设置为0,errno.h中定义了所有常数都不为0错误信息输出strerror() - errno对应的错误信息perror() 输出用户信息及errno对应的错误信息Unix文件基础-用户标识用户ID(uid)标识不同的用户,用户登录时通过/etc/passwd文件配置通过getuid()可以获取uid每个文件/目录都有相应的owner权限(-rwx)组I

3、D(gid)及添加组ID通过组将多个有用户集中起来进行管理用户登录时通过/etc/passwd文件配置组ID与组名通过/etc/group文件配置每个文件/目录都有相应的group权限(-rwx)实际用户ID和有效用户ID (进程控制部分讲解)实际组ID和有效组ID (进程控制部分讲解)1.2.Unix文件基础-系统调用和库函数系统调用用户空间进程内核的接口把用户从底层的硬件编程中解放出来极大的提高了系统的安全性使用户程序具有可移植性库函数库函数为了实现某个功能而封装起来的API集合提供的编程接口,更加便于应用程序的移植Unix文件基础-系统调用和库函数系统调用与库函数的比较所有的操作系统都提

4、供多种服务的向内核请求服务点,通过这些点,程序从执行者的角度来看,系统调用和库函数之间有用户的角度来看,其区别并不非常的重要。的区别,但从应用程序可以调用系统调用或者库函数,库函数则会调用系统调用来完成其功能。系统调用通常提供一个较复杂的功能。系统的最小界面,而库函数通常提供比第二节文件IO函数文件I/O文件描述符Linux内核为每个进程了一张表,这个表了这个进程,这个正在打开的哪些文件,表里每条就是文件描述符一个非负整数取值范围0OPEN_MAXOPEN_MAX通常为64都有一个普通文件的文件描述符一般=3所有文件操作函数都围绕文件描述符展开标准输入、标准输出和标准出错由s默认打开,分别为0

5、/1/2文件I/O相关系统调用函数列表open打开文件create 创建新文件close read write lseek ac ioctl fcntl关闭文件读文件 写文件设置当前文件偏移量测试文件io操作杂物箱s权限改变已打开文件的性质fs、s、ls获取文件的元信息文件描述符dup、dup2文件I/O-open和closeopen()/creat()函数可以打开或者创建一个文件open()和creat()调用成功返回文件描述符,失败返回-1,并设置 errno。open()/creat()调用返回的文件描述符一定是最小的未用描述符数字。creat()等价于open(pathname, O_

6、CREAT|O_WRONLY|O_TRUNC, mode)open()可以打开设备文件,但是不能创建设备文件,设备文件必须使用mknod()创建。文件I/O-open和close原型open(const char *pathname,flags, mode_t mode);参数pathna me被打开的文件名(可包括路径名)。flagsO_RDONLY:只读方式打开文件。这三个参数互斥O_WRONLY:可写方式打开文件。O_RDWR:读写方式打开文件。O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三的参数为其设置权限。O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消

7、息。这一参数可测试文件是否存在。O_NOCTTY:使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端。O_TRUNC:如文件已经存在,那么打开文件时先删除文件中原有数据。O_APPEND:以添加方式打开文件,所以对文件的写操作都在文件的末尾进行。mode被打开文件的存取权限,为8进制表示法。文件I/O-open和closeclose()函数可以关闭一个打开的文件#include close(filders);调用成功返回0,出错返回-1,并设置errno。当一个进程终止时,该进程打开的所有文件都由内核自动关闭。关闭一个文件的同时,也录锁。该进程加在该文件

8、上的所有记文件I/O-read和writeread()函数可以从一个已打开的可读文件中数据read()调用成功返回的字节数,如果返回0,表示到达文件末尾,如果返回-1,表示出错,通过errno设置错误码。读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际的字节数。文件I/O-read和writewrite()函数可以向一个已打开的可写文件中写入数据write()调用成功返回已写的字节数,失败返回-1,并设置errno。 write()的返回值通常与count不同,因此需要循环将全部待写的数据全部写入文件。write()出错的常见原因:磁盘已满或者超过了一个给定进程的文件长度限制。

9、对于普通文件,写操作从文件的当前位移量处开始,如果在打开文件时,指定了O_APPEND参数,则每次写操作前,将文件位移量设置在文件的结尾处,在一次成功的写操作后,该文件的位移量增加实际写的字节数。文件I/O-read和writewrite()函数反复的写入:文件I/O-Lseek调用 lseek()函数可以显示的定位一个已打开的文件。off_t lseek(fd,off_t offset,whence);原型fd:文件描述符。offset:偏移量,每一读写操作所需要移动的距离,(向前移,向后移)是字节的数量,可正可负SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小。参数whence

10、 (当前位置基点):SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量。SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。成功:文件的当前位移返回值-1:出错文件I/O-Lseek每个打开的文件都有一个与其相关的“当前文件位移量”,它是一个非负整数,用以度量从文件开始处计算的字节数。通常,读/写操作都从当前文件位移量处开始,在读/写调用成功后,使位移量增加所读或者所写的字节数。lseek()调用成功为新的文件位移量,失败返回-1,并设置errno。lseek()只对常规文件有效,对socket、管道、FIFO等进行lseek()操作失败。lseek

11、()仅将当前文件的位移量在内核中,它并不引起任何I/O操作文件位移量可以大于文件的当前长度,在这种情况下,对该文件的写操作会延长文件,并形成空洞。文件I/O-Lseekexle: 创建一个有空洞的文件:/FIXME :loack to write rest dataIf(write(fd,buf1,strlen(buf1)strlen(buf1)fprf(stderr,”buf1 write errorn”);return -1;If(lseek(fd,40,seek_set)=-1)fprf(stderr,”lseek() errorn”);return -1;/FIXME:Loack to

12、 write reset dataIf(write(fd,buf2,strlen(buf2)strlen(buf2)fprf(stderr,”buf1 write errorn”);return -1;问题:创建有空洞的文件有何用途?文件I/O-作业任务描述使用非缓冲I/O方式,实现一个copy程序,该程序的第一个命令行参数为源文件,第二个命令行参数为目标文件,程序实现将源文件中的内容到目标文件。命令行参数可以使用argv1第一个参数,argv2第二个参数使用diff工具检查目标文件与源文件是否一致实现思路打开源文件 打开目标文件循环源文件并写入目标文件关闭源文件关闭目标文件文件I/O-作业任

13、务描述使用非缓冲I/O方式,实现一个copy程序,该程序的第一个命令行参数为源文件,第二个命令行参数为目标文件,程序实现将源文件中的内容到目标文件。命令行参数可以使用argv1第一个参数,argv2第二个参数使用diff工具检查目标文件与源文件是否一致关闭目标文件文件I/O-作业实现思路打开源文件打开目标文件循环源文件并写入目标文件关闭源文件第三节文件属性操作文件属性操作-s、fs、ls以下三个函数可以获取文件/目录的属性信息:三个函数的返回:若成功则为0,若出错则为-1,并且设置errno.给定一个pathname的情况下:s函数返回一个与此命名文件有关的信息结构fsls函数获得已在描述符f

14、iledes上打开的文件的有关信息函数类似于s,但是当命名的文件是一个符号连接时,ls返回该符号连接的有关信息,而不是由该符号连接的文件的信息。文件属性操作-s、fs、lsstruct s定义:文件属性操作-取得文件类型可以用以下的宏确定文件类型。这些宏的参数都是struct s结构中的st_mode成员。S_ISREG(m)is it a regular file?S_ISDIR(m)S_ISCHR(m)directorycharacter deviceS_ISBLK(m)S_ISFIFO(m)block device fifosymbolic link(Not inS_ISLNK(m)IX

15、 1-1996.)S_ISSOCK(m)socket (Not inIX 1-1996)文件属性操作-acs当用open函数打开一个文件时,内核以进程的有效用户ID和有效组ID为基础执行其存取权测试。有时,进程也希望按其实际用户ID和实际组ID来测试其存取能力。#includeacs(const char *path,amode)例如当一个进程使用设置-用户-ID,或设置-组-ID特征作为另一个用户(或组)运行时,这就可能需要测试其存取能力,即使一个进程可能已经设置-用户-ID为根,它仍可能想验证实际用户能否存取一个给定的文件。acs()函数是按实际用户ID和实际组ID进行存取权 测试的。#i

16、ncluderesult;Const char *filename=“/tmp/myfile”;Result=acs(filename,F_OK);第四节目录文件操作文件目录操作常见函数列表mkdir rmdir chdir getcwd opendir readdirldir seekdirclosedir创建目录删除目录改变工作目录获取当前工作目录打开目录流读目录的每一项返回操作目录的位置设置目录项的位置关闭目录流目录操作目录操作函数目录操作目录读写函数目录操作-例子:第四节其他文件相关操作知识点-其他文件相关操作常见函数列表unlink link symlinkod n mmapmunm

17、ap删除 创建硬创建符号改变文件或目录的权限改变文件或目录的属主和组内存解除内存内容同步其他文件相关操作-函数相关函数其他文件相关操作-ioctl设备控制函数ioctl功能:主要是获取设备信息返回值:成功返回0, 失败为NULL参数:d: request:文件描述符请求命令可变参数列表ioctl例子:ioctl例子:其他文件相关操作函数内存函数mmap功能:创建一个指向一段内存的指针,这段内存与文件内容相关联返回值:成功返回被内存空间的首地址, 失败为NULL参数:addr: len: prot: flags: fildes:请求使用某个特定的内存地址,为NULL时自动分配被内存空间的大小内存段权限(见下一页)控制程序对内存段的改变所造成的影响(见下一页)打开的文件描述符其他文件相关操作函数Mmap参数说明PortFlagsPROT_READ允许读内存段PROT_WRITE允许写内存段PROT_EXEC允许执行内存段PROT_NONE不能内存段MAP_PRIVATE对内存段的 操作导致创建

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论