Linux文件IO编程.ppt_第1页
Linux文件IO编程.ppt_第2页
Linux文件IO编程.ppt_第3页
Linux文件IO编程.ppt_第4页
Linux文件IO编程.ppt_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、Linux文件I/O编程,Linux编程基础:man,1.一般命令(shell命令) 2.系统调用(open write等直接陷入内核的函数) 3.子函数(C函数库等不直接陷入内核的函数) 4.特殊文件(/dev/zero等linux系统中有特殊用途的文件) 5.文件格式(linux系统的配置文件格式 host.conf) 6.游戏 7.宏和地方传统定义(本地配置) 8.维护命令(tcpdump等用来观察linux系统运行情况的命令),Linux编程基础,目录也是文件 进程被启动的目录成为工作目录 起始目录也称home目录 目录操作函数有 opendir readdir closedir 文件

2、描述符:当打开一个文件时,内核就会分配给你一个非负整数,通过这个整数便可读写文件。,Linux编程基础,标准输入 文件描述为0 STDIN_FILENO 标准输出 文件描述为1 STDOUT_FILENO 标准错误输出 文件描述符为2 STDERR_FILENO 不带缓冲的I/O,直接调用系统调用,速度快。(open read write) 带缓冲的I/O,在系统调用前采用一定的策略,速度慢,比不带缓冲的I/O安全。 (fopen fread fwrite),缓冲和非缓冲I/O,Linux出错处理,一般Linux函数出错时会返回一个负值。附加信息会放在errno中。 中定义了errno变量以及

3、附加信息的常量。 errno只有在函数出错时才有意义,并且不可能为0 可以通过strerror和perror打印出当前errno对应的文字描述信息。,Linux编程基础,signal是通知进程发生某种时间的技术。 每种信号都有系统默认处理方式,程序员也可以提供专门的函数处理程序感兴趣的信号。 系统调用:操作系统提供给应用使用的接口,通过这些接口应用程序可以访问内核的服务。,Linux时间,通过 time command可以跟踪该command的执行时间情况。 分为时钟时间、系统CPU时间、用户CPU时间。 time locate kk,real 0m0.113s 整个命令执行时间 user 0

4、m0.092s 用户空间执行时间 sys 0m0.012s 内核执行时间,文件时间戳,文件最后访问时间 ls -lu 文件修改时间 ls -l inode修改时间 ls -lc,文件I/O:open,open函数:调用它可以打开或者创建一个文件。 #include int open(const char *pathname, int flags) int open(const char *pathname, int flags, mode_t mode) 如果失败,返回值为-1 参数解析: pathname是要打开或者创建的文件名。 flags 文件打开时候的选项 O_RDONLY 以只读方式

5、打开文件。 O_WRONLY 以只写方式打开文件。 O_RDWR 以读、写方式打开文件。 这三个选项是必选的!,文件I/O:open,flags 可选选项: O_APPEND 以追加方式打开文件,每次写时都写在文件末尾。 O_CREAT 如果文件不存在,则创建一个,存在则打开它。 O_EXCL 与O_CREAT一起使用时,如果文件已经存在则返回出错。 O_TRUNC 以只写或读写方式打开时,把文件截断为0 O_DSYNC 每次write时,等待数据写到磁盘上。 O_RSYNC 每次读时,等待相同部分先写到磁盘上。 O_SYNC 每次write时,等到数据写到磁盘上并接更新文件属性。 SYNC选

6、项都会影响降低性能,有时候也取决于文件系统的实现。,文件I/O:open,mode 只有创建文件时才使用此参数,指定文件的访问权限。模式有: S_IRWXUGO 可读 可写 可执行 S_IRUSR GRP OTH 可读 S_IWUSR GRP OTH 可写 S_IXUSR GRP OTH 可执行 S_ISUID 设置用户ID S_ISGID 设置组ID Uuser Ggroup Oothers,文件I/O:creat,creat 以只写方式创建一个文件,若文件已经存在,则把它截断为0 #include int creat(const char *pathname, mode_t mode) 参

7、数解析: pathname 要创建的文件名称 mode 跟open的第三个参数相同,可读,可写,可执行 。 如果失败 ,返回值为-1 creat函数等同于 open (pathname, O_WRONLY | O_CREAT | O_TRUNC, mode),文件I/O:close,close 关闭已经打开的文件,并释放文件描述符 #include int close(int filedes) 参数解析: filedes 文件描述符,有open或者creat返回的非负整数。 如果失败,返回值为-1 当一个进程结束时,操作系统会自动释放该进程打开的所有文件。但还是推荐用close来关闭文件。 l

8、sof命令可以查看进程打开了那些文件。,文件I/O:lseek,lseek 用来定位当前文件偏移量,既你对文件操作从文件的那一部分开始。 #include off_t lseek(int filedes, off_t offset, int whence); 如果失败,返回值为-1,成功返回移动后的文件偏移量。 参数解析: filedes 文件描述符 offset 必须与whence一同解析 whence为 SEEK_SET, 则offset从文件的开头算起。 whence为 SEEK_CUR, 则offset从当前位置算起,既新偏移量为当前偏移量加上offset whence为 SEEK_E

9、ND, 则offset从文件末尾算起。 可以通过lseek、write来快速创建一个大文件。,文件I/O:read,read 从当前文件偏移量处读入指定大小的文件内容 #include ssize_t read(int filedes, void *buf, size_t nbytes) 失败返回-1, 成功返回读入的字节数,到文件末尾返回0 参数解析 filedes 文件描述符 ,有open返回。 buf 读入文件内容存放的内存首地址。 nbytes 要读取的字节数。 实际读入的字节数可能会小于要求读入的字节数。比如文件只有所剩的字节数小于你要读入的字节数,读取fifo文件和网络套接字时都可

10、能出现这种情况。,文件I/O:write,write向一个文件写入一定字节的内容。 #include ssize_t write(int filedes, const void * buff, size_t nbytes) 失败返回-1,成功返回实际写入的字节数。当磁盘满或者文件到达上限时可能写入失败。 一般从当前文件偏移量出写入,但如果打开时使用了O_APPEND,那么无论当前文件偏移量在哪里,都会移动到文件末尾写入。,Linux I/O实现,内核使用了三种数据结构,来实现I/O 1. 每个进程在进程表中都有一个记录项,每个记录项中有一张打开文件描述符表,可将其视为一个矢量,每个描述符占用一

11、项。与每个文件描述符相关联的是: (a) 文件描述符标志。 (b) 指向一个文件表项的指针。 2. 内核为所有打开文件维持一张文件表。每个文件表项包含: (a) 文件状态标志(读、写、增写、同步等)。 (b) 当前文件位移量。 (c) 指向该文件v节点表项的指针。 3. 每个打开文件(或设备)都有一个v节点结构。v节点包含了文件类型和对此文件进行各种操作的函数的指针信息。对于大多数文件, v节点还包含了该文件的i节点(索引节点)。例如, i节点包含了文件的所有者、文件长度、文件所在的设备、指向文件在盘上所使用的实际数据块的指针等等,Linux I/O实现,内核数据结构,Linux I/O实现,

12、文件共享 两个文件各自打开同一个文件,它们拥有各自的文件表项,但共享v节点表。,Linux I/O原子操作,A B两个进程以O_APPEND方式打开同一个文件。 A 进程去写该文件,假设此时文件偏移量为1000 B进程同时去写该文件,此时由于A进程未写完,则B进程得到的文件偏移量仍为1000. 最后B进程的内容可能会覆盖掉A进程写的内容。,Linux I/O原子操作,pread , pwrite原子读写操作。相当于先把文件偏移量定位到offset,然后在进行读写。这都是一步完成,不存在竞争问题。 #include ssize_t pread(int filedes, void *buf, si

13、ze_t nbytes, off_t offset) ssize_t pwrite(int filedes, const void *buf, size_t nbytes, off_t offset) 返回值跟read和write一样 offset为文件偏移量。,Linux I/O:dup,dup/dup2用来复制一个已经存在的文件描述符 #include int dup(int filedes) ; int dup2(int filedes, int filedes2) ; 失败返回-1,成功返回新文件描述符。filedes2是新文件描述符,如果已经打开则先关闭它。 ssize_t prea

14、d(int filedes, void *buf, size_t nbytes, off_t offset); 共享文件表项。,Linux I/O:sync,#include int fsync(int filedes) 把指定文件的数据和属性写入到磁盘。 int fdatasync(int filedes) 把指定文件的数据部分写到磁盘。 void sync(void) 把修改部分排入磁盘写队列,但并不意味着已经写入磁盘。,Linux I/O:fcntl,fcntl 可以改变已经打开的描述符。 #include #include int fcntl(int fd, int cmd) int

15、fcntl(int fd, int cmd, long arg) 参数解析: 第一个为已经打开的文件描述符 第二个为要对文件描述采取的动作 F_DUPFD 复制一个文件描述,返回值为新描述符。 F_GETFD/F_SETFD 目前只有FD_CLOEXEC一个,set时候会用到第三个参数。 F_GETFL / F_SETFL 得到或者设置目前的文件描述符属性,返回值为当前属性。设置时使用第三个参数。,文件目录操作:stat,s t a t函数返回一个与此命名文件有关的信息结构, f s t a t函数获得已在描述符 filedes上打开的文件的有关信息。l s t a t函数类似于s t a t

16、,但是当命名的文件是一个符号连接时,l s t a t返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。 #include #include int stat(const char *pathname, struct stat *bu f) ; int fstat(int filedes,struct stat *bu f) ; int lstat(const char *pathname, struct stat *buf) ; 三个函数的返回:若成功则为0,若出错则为-1,stat数据结构,struct stat mode_t st_mode; /* 文件类型和权限 */ in

17、o_t st_ino; /* inode 号*/ nlink_t st_nlink; /* 链接数目 */ uid_t st_uid; /* 文件所有者的uid*/ gid_t st_gid; /* 文件所有者的组id */ off_t st_size; /* 文件大小 */ time_t st_atime; /* 最后访问时间 */ time_t st_mtime; /* 最后修改时间 */ time_t st_ctime; /* 最后文件状态修改时间*/ blksize_t st_blksize; /* 最佳读写I/O块大小 */ blkcnt_t st_blocks; /* 一共有多少个

18、块*/ ;,文件类型宏定义,S_ISREG()普通文件 S_ISDIR()目录文件 S_ISCHR()字符文件 S_ISBLK()块文件 S_ISFIFO()管道或者FIFO S_ISLNK()符号链接 S_ISSOCK() 套接字socket 以上宏定义在中,设置用户ID和设置组ID,与一个进程关联的ID至少有6个,通过这6个ID构成了Linux的安全访问系统。,设置用户ID和设置组ID,一个可执行文件没有设置用户ID和设置组ID,那么 实际用户/组ID=有效用户/组ID=保存用户/组ID=执行该程序的用户ID 一个文件设置了用户ID和组ID,那么实际用户/组ID=执行改程序的用户ID, 有

19、效用户/组ID=保存用户/组ID=改程序所属用户的ID,,文件目录操作:access,a c c e s s 按实际用户I D和实际组I D进行文件权限的测试。 # i n c l u d e int access(const char *pathname, int mode) ; 返回:若成功则为0,若出错则为-1 参数解析: mode值可以是以下几种: R_OK 测试读许可权 W_OK 测试写许可权 X_OK 测试执行许可权 F_OK 测试文件是否存在,文件操作函数: truncate,truncate 把某个文件截短到一定长度,跟open 中的O_TRUNC类似。 int truncat

20、e(const char *pathname, off_t length); int ftruncate(int filedes, off_t length); 成功返回0 ,失败返回-1,文件操作函数,link函数用来创建一个硬链接文件 int link(const char *existingpath, const char *newpath); symlink用来创建一个软链接文件 int symlink(const char *actualpath, const char *sympath); unlink删除软链接时只删除链接文件本身,被连接的文件不受影响。删除硬链接时,如果inod

21、e引用数为0,则删除文件。如果有进程还在使用该文件,则可以继续使用。 int unlink(const char *pathname); readlink只读取软连接本身 ssize_t readlink(const char* restrict pathname, char *restrict buf, size_t bufsize);,函数的符号链接问题,文件操作函数:utime,utime读取文件的最后访问时间和修改实际那 #include int utime(const char *pathname, const struct utimbuf *times); struct utimb

22、uf time_t actime; /* 最后访问时间 */ time_t modtime; /* 最后修改时间 */ Inode属性的修改时间有内核来完成,应用程序没有权限去设置。,目录操作函数,opendir用来打开一个目录 的内容,并返回目录指证。 #include DIR *opendir(const char *pathname); 成功返回DIR指针,失败返回NULL readdir 以一定次序读取目录内容, struct dirent *readdir(DIR *dp); struct dirent ino_t d_ino; /* i-node 号 */ char d_nameNAME_MAX + 1; /*文件或目录名*/ ,目录操

温馨提示

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

评论

0/150

提交评论