收藏 分销(赏)

Linux文件IO编程PPT.ppt

上传人:a199****6536 文档编号:5887551 上传时间:2024-11-22 格式:PPT 页数:44 大小:873KB
下载 相关 举报
Linux文件IO编程PPT.ppt_第1页
第1页 / 共44页
Linux文件IO编程PPT.ppt_第2页
第2页 / 共44页
Linux文件IO编程PPT.ppt_第3页
第3页 / 共44页
Linux文件IO编程PPT.ppt_第4页
第4页 / 共44页
Linux文件IO编程PPT.ppt_第5页
第5页 / 共44页
点击查看更多>>
资源描述

1、,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,Linux,文件,I/O,编程,李杰聪,Linux,编程基础,:man,1.,一般命令(,shell,命令),2.,系统调用(,open write,等直接陷入内核的函数),3.,子函数(,C,函数库等不直接陷入内核的函数),4.,特殊文件(,/dev/zero,等,linux,系统中有特殊用途的文件),5.,文件格式,(linux,系统的配置文件格式,hos

2、t.conf),6.,游戏,7.,宏和地方传统定义,(,本地配置,),8.,维护命令,(tcpdump,等用来观察,linux,系统运行情况的命令,),2,Linux,编程基础,目录也是文件,进程被启动的目录成为工作目录,起始目录也称,home,目录,目录操作函数有,opendir readdir closedir,文件描述符:当打开一个文件时,内核就会分配给你一个非负整数,通过这个整数便可读写文件。,3,Linux,编程基础,标准输入 文件描述为,0 STDIN_FILENO,标准输出 文件描述为,1 STDOUT_FILENO,标准错误输出 文件描述符为,2 STDERR_FILENO,不

3、带缓冲的,I/O,直接调用系统调用,速度快。(,open read write,),带缓冲的,I/O,在系统调用前采用一定的策略,速度慢,比不带缓冲的,I/O,安全。,(fopen fread fwrite),4,缓冲和非缓冲,I/O,5,Linux,出错处理,一般,Linux,函数出错时会返回一个负值。附加信息会放在,errno,中。,中定义了,errno,变量以及附加信息的常量。,errno,只有在函数出错时才有意义,并且不可能为,0,可以通过,strerror,和,perror,打印出当前,errno,对应的文字描述信息。,6,Linux,编程基础,signal,是通知进程发生某种时间的

4、技术。,每种信号都有系统默认处理方式,程序员也可以提供专门的函数处理程序感兴趣的信号。,系统调用:操作系统提供给应用使用的接口,通过这些接口应用程序可以访问内核的服务。,7,文件时间戳,文件最后访问时间,ls-lu,文件修改时间,ls-l,inode,修改时间,ls-lc,8,文件,I/O,:,open,open,函数,:,调用它可以打开或者创建一个文件。,#include,int open(const char*pathname,int flags),int open(const char*pathname,int flags,mode_t mode),如果失败,返回值为,-1,参数解析:,

5、pathname,是要打开或者创建的文件名。,flags,文件打开时候的选项,O_RDONLY,以只读方式打开文件。,O_WRONLY,以只写方式打开文件。,O_RDWR,以读、写方式打开文件。,这三个选项是必选的!,9,文件,I/O,:,open,flags,可选选项:,O_APPEND,以追加方式打开文件,每次写时都写在文件末尾。,O_CREAT,如果文件不存在,则创建一个,存在则打开它。,O_EXCL,与,O_CREAT,一起使用时,如果文件已经存在则返回出错。,O_TRUNC,以只写或读写方式打开时,把文件截断为,0,O_DSYNC,每次,write,时,等待数据写到磁盘上。,O_RS

6、YNC,每次读时,等待相同部分先写到磁盘上。,O_SYNC,每次,write,时,等到数据写到磁盘上并接更新文件属性。,SYNC,选项都会影响降低性能,有时候也取决于文件系统的实现。,10,文件,I/O,:,open,mode,只有创建文件时才使用此参数,指定文件的访问权限。模式有:,S_IRWXUGO,可读 可写 可执行,S_IRUSR GRP OTH,可读,S_IWUSR GRP OTH,可写,S_IXUSR GRP OTH,可执行,S_ISUID,设置用户,ID,S_ISGID,设置组,ID,U,user Ggroup Oothers,11,文件,I/O,:,creat,creat,以只

7、写方式创建一个文件,若文件已经存在,则把它截断为,0,#include,int creat(const char*pathname,mode_t mode),参数解析:,pathname,要创建的文件名称,mode,跟,open,的第三个参数相同,可读,可写,可执行。,如果失败,返回值为,-1,creat,函数等同于,open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode),12,文件,I/O,:,close,close,关闭已经打开的文件,并释放文件描述符,#include,int close(int filedes),参数解析:,filedes,文件描述符,

8、有,open,或者,creat,返回的非负整数。,如果失败,返回值为,-1,当一个进程结束时,操作系统会自动释放该进程打开的所有文件。但还是推荐用,close,来关闭文件。,lsof,命令可以查看进程打开了那些文件。,13,文件,I/O,:,lseek,lseek,用来定位当前文件偏移量,既你对文件操作从文件的那一部分开始。,#include,off_t lseek(int filedes,off_t offset,int whence);,如果失败,返回值为,-1,,成功返回移动后的文件偏移量。,参数解析:,filedes,文件描述符,offset,必须与,whence,一同解析,whenc

9、e,为,SEEK_SET,则,offset,从文件的开头算起。,whence,为,SEEK_CUR,则,offset,从当前位置算起,既新偏移量为当前偏移量加上,offset,whence,为,SEEK_END,,则,offset,从文件末尾算起。,可以通过,lseek,、,write,来快速创建一个大文件。,14,文件,I/O,:,read,read,从当前文件偏移量处读入指定大小的文件内容,#include,ssize_t read(int filedes,void*buf,size_t nbytes),失败返回,-1,成功返回读入的字节数,到文件末尾返回,0,参数解析,filedes,文

10、件描述符,有,open,返回。,buf,读入文件内容存放的内存首地址。,nbytes,要读取的字节数。,实际读入的字节数可能会小于要求读入的字节数。比如文件只有所剩的字节数小于你要读入的字节数,读取,fifo,文件和网络套接字时都可能出现这种情况。,15,文件,I/O,:,write,write,向一个文件写入一定字节的内容。,#include,ssize_t write(int,filedes,const void*,buff,size_t,nbytes,),失败返回,-1,,成功返回实际写入的字节数。当磁盘满或者文件到达上限时可能写入失败。,一般从当前文件偏移量出写入,但如果打开时使用了,

11、O_APPEND,,那么无论当前文件偏移量在哪里,都会移动到文件末尾写入。,16,Linux I/O,实现,内核使用了三种数据结构,来实现,I/O,1.,每个进程在进程表中都有一个记录项,每个记录项中有一张打开文件描述符表,可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是:,(a),文件描述符标志。,(b),指向一个文件表项的指针。,2.,内核为所有打开文件维持一张文件表。每个文件表项包含:,(a),文件状态标志,(,读、写、增写、同步等,),。,(b),当前文件位移量。,(c),指向该文件,v,节点表项的指针。,3.,每个打开文件(或设备)都有一个,v,节点结构。,v,节点

12、包含了文件类型和对此文件进行各种操作的函数的指针信息。对于大多数文件,,v,节点还包含了该文件的,i,节点(索引节点)。例如,,i,节点包含了文件的所有者、文件长度、文件所在的设备、指向文件在盘上所使用的实际数据块的指针等等,17,Linux I/O,实现,内核数据结构,18,Linux I/O,实现,文件共享,两个进程各自打开同一个文件,它们拥有各自的文件表项,但共享,v,节点表。,19,Linux I/O,原子操作,A B,两个进程以,O_APPEND,方式打开同一个文件。,A,进程去写该文件,假设此时文件偏移量为,1000,B,进程同时去写该文件,此时由于,A,进程未写完,则,B,进程得

13、到的文件偏移量仍为,1000.,最后,B,进程的内容可能会覆盖掉,A,进程写的内容。,20,Linux I/O,原子操作,pread,pwrite,原子读写操作。相当于先把文件偏移量定位到,offset,,然后在进行读写。这都是一步完成,不存在竞争问题。,#include,ssize_t pread(int filedes,void*buf,size_t nbytes,off_t offset),ssize_t pwrite(int filedes,const void*buf,size_t nbytes,off_t offset),返回值跟,read,和,write,一样,offset,为文

14、件偏移量。,21,Linux I/O,:,dup,dup/dup2,用来复制一个已经存在的文件描述符,#include,int dup(int,filedes,);,int dup2(int,filedes,int,filedes2,);,失败返回,-1,,成功返回新文件描述符。,filedes2,是新文件描述符,如果已经打开则先关闭它。,ssize_t pread(int filedes,void*buf,size_t nbytes,off_t offset);,共享文件表项。,22,Linux I/O,:,sync,#include,int fsync(int filedes),把指定文件

15、的数据和属性写入到磁盘。,int fdatasync(int filedes),把指定文件的数据部分写到磁盘。,void sync(void),把修改部分排入磁盘写队列,但并不意味着已经写入磁盘。,23,Linux I/O,:,fcntl,fcntl,可以改变已经打开的描述符。,#include,#include,int fcntl(int fd,int cmd),int fcntl(int fd,int cmd,long arg),参数解析:,第一个为已经打开的文件描述符,第二个为要对文件描述采取的动作,F_DUPFD,复制一个文件描述,返回值为新描述符。,F_GETFD/F_SETFD,目

16、前只有,FD_CLOEXEC,一个,,set,时候会用到第三个参数。,F_GETFL/F_SETFL,得到或者设置目前的文件描述符属性,返回值为当前属性。设置时使用第三个参数。,24,文件目录操作:,stat,s t a t,函数返回一个与此命名文件有关的信息结构,,f s t a t,函数获得已在描述符,filedes,上打开的文件的有关信息,。l s t a t,函数类似于,s t a t,,但是当命名的文件是一个符号连接时,,l s t a t,返回该符号连接的有关信息,,,而不是由该符号连接引用的文件的信息,。,#include,#include,int stat(const char

17、*,pathname,struct stat*,bu f,);,int fstat(int,filedes,struct stat*,bu f,);,int lstat(const char*,pathname,struct stat*,buf,);,三个函数的返回:若成功则为,0,,若出错则为,-1,25,stat,数据结构,struct stat,mode_t st_mode;/*,文件类型和权限*,/,ino_t st_ino;/*inode,号*,/,nlink_t st_nlink;/*,链接数目*,/,uid_t st_uid;/*,文件所有者的,uid*/,gid_t st_gi

18、d;/*,文件所有者的组,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;/*,一共有多少个块*,/,;,26,文件类型宏定义,S_ISREG(),普通文件,S_ISDIR(),目录文件,S_ISCHR(),字符文件,S_ISBLK(),块文件,S_ISFIFO(),管道或者,FIFO,

19、S_ISLNK(),符号链接,S_ISSOCK(),套接字,socket,以上宏定义在,中,27,设置用户,ID,和设置组,ID,实际用户,ID,实际组,ID,我们实际上是谁,既运行该进程用户。,有效用户,ID,有效组,ID,附加组,ID,有效,ID,用来检查是否有权限访问文件等资源,保存的用户,ID,保存的组,ID,程序启动时有系统设置,与一个进程关联的,ID,至少有,6,个,通过这,6,个,ID,构成了,Linux,的安全访问系统。,28,设置用户,ID,和设置组,ID,一个可执行文件没有设置用户,ID,和设置组,ID,,那么 实际用户,/,组,ID=,有效用户,/,组,ID=,保存用户,

20、/,组,ID=,执行该程序的用户,ID,一个文件设置了用户,ID,和组,ID,,那么实际用户,/,组,ID=,执行改程序的用户,ID,,有效用户,/,组,ID=,保存用户,/,组,ID=,改程序所属用户的,ID,,,29,文件目录操作:,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,_,

21、OK,测试执行许可权,F,_,OK,测试文件是否存在,30,文件操作函数:,truncate,truncate,把某个文件截短到一定长度,跟,open,中的,O_TRUNC,类似。,int truncate(const char*pathname,off_t length);,int ftruncate(int filedes,off_t length);,成功返回,0,,失败返回,-1,31,文件操作函数,link,函数用来创建一个硬链接文件,int link(const char*existingpath,const char *newpath);,symlink,用来创建一个软链接文件,

22、int symlink(const char*actualpath,const char *sympath);,unlink,删除软链接时只删除链接文件本身,被连接的文件不受影响。删除硬链接时,如果,inode,引用数为,0,,则删除文件。如果有进程还在使用该文件,则可以继续使用,。,int unlink(const char*pathname);,readlink,只读取软连接本身,ssize_t readlink(const char*restrict pathname,char*restrict buf,size_t bufsize);,32,函数的符号链接问题,函数名,不跟随符号链接,

23、跟随符号链接,access,chdir,chmod,chown,creat,exec,lchown,link,lstat,函数名,不跟随符号链接,跟随符号链接,open,opendir,readlink,remove,rename,stat,truncate,unlink,33,文件操作函数:,utime,utime,读取文件的最后访问时间和修改实际,#include,int utime(const char*pathname,const struct utimbuf*times);,struct utimbuf,time_t actime;/*,最后访问时间*,/,time_t modtim

24、e;/*,最后修改时间*,/,Inode,属性的修改时间有内核来完成,应用程序没有权限去设置。,34,目录操作函数,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;/*,文件或目录名*,/,35,目录操作函数,rewinddir,

25、重置目录的输入流,重置后从第一个目录项开始读。,void rewinddir(DIR*dp);,telldir,返回目录流的当前位置,long telldir(DIR*dp);,seekdir,设置目录流位置。,void seekdir(DIR*dp,long loc);,loc,有,telldir,返回,closedir,关闭目录流,int closedir(DIR*dp);,36,其他函数,int chmod(const char*pathname,mode_t mode);,int fchmod(int filedes,mode_t mode);,mode_t umask(mode_t

26、cmask);,int chown(const char*pathname,uid_t owner,gid_t group);,int fchown(int filedes,uid_t owner,gid_t group);,int lchown(const char*pathname,uid_t owner,gid_t group);,37,其他目录函数,int mkdir(const char*pathname,mode_t mode);,int rmdir(const char*pathname);,int chdir(const char*pathname);,int fchdir(i

27、nt filedes);,char*getcwd(char*buf,size_t size);,38,口令文件,/etc/passwd,存放用户登录时的初始化信息,一行一个用户。,依次存放 用户名 密码,UID GID,注释字段 初始工作目录 初始,shell,类型。例如:,jli:x:500:500:/home/jli:/bin/bash,操作,passwd,函数,#include,根据用户名得到解析后的条目,struct passwd*getpwnam(const char*name);,根据用户,ID,得到解析后的条目,struct passwd*getpwuid(uid_t uid);

28、,Linux,系统也提供遍历整个,passwd,文件的函数。具体参见,man,39,阴影口令文件,/etc/shadow,是用来存放单向加密后的用户口令副本,一行一个用户,所以成为,passwd,的阴影。,依次存放 用户名 加密后口令 口令已使用时间 口令失效时间 等,jli:$1$GKJS4dWj$3sPQnqql9d926uxZ1q5uR.:14545:0:99999:7:,操作,shadow,函数,#include,根据用户名得到解析后的条目,struct spwd*getspnam(char*name);,Linux,也提供遍历整个,shadow,文件的函数,具体参见,man,40,阴

29、影口令解析,加密后口令,$1$GKJS4dWj$3sPQnqql9d926uxZ1q5uR.,$1,表示该口令是采用,md5,单向加密算法加密而成,$GKJS4dWj$,表示,md5,加密时候采用的,salt,值,3sPQnqql9d926uxZ1q5uR.,是加密后的结果。,运行,openssl passwd-1-salt,GKJS4dWj,nokia123,就能得到加密后结果。,41,crypt,crypt,为,linux,提供的加密函数,一开始仅提供,DES,加密算法,经扩展后也提供,MD5,加密算法。,#define _XOPEN_SOURCE/,该宏定义必须加上!,#include,

30、char*crypt(const char*key,const char*salt);,参数一为要加密的内容。,参数二为,salt,值,如果,salt,值最多为,8,个字符。以,$1$,开头就意味着使用,md5,算法,.,参考,file/md5.c,42,作业,1.,打印出某个目录下的文件和目录,并且需要打印出这些文件的类型(比如 链接文件,普通文件等)。,2.,在题一的基础上,递归遍历打印一个目录,即如果这个目录下还有目录,那么也应该打印下级目录下的所有内容。,3.,把打印结果保存到一个文件中。,43,4.,写一个程序,该程序实现往一个文件中写数据,要求:,(1),写,2G,数据到文件,(2),测试写入速度,尝试修改程序,让其达到更快的写入速度,5.,写一个程序,改程序获得用户输入的用户名和密码,然后根据,/etc/shadow,文件判断用户输入的用户名和密码是否匹配。,44,

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服