Linux网络编程(第二版):第3章 文件系统简介_第1页
Linux网络编程(第二版):第3章 文件系统简介_第2页
Linux网络编程(第二版):第3章 文件系统简介_第3页
Linux网络编程(第二版):第3章 文件系统简介_第4页
Linux网络编程(第二版):第3章 文件系统简介_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

第3章文件系统简介3.1

Linux下的文件系统3.2文件的通用操作方法3.3socket文件类型3.1

Linux下的文件系统3.1.1Linux下文件的内涵3.1.2文件系统的创建3.1.3挂接文件系统3.1.4索引节点inode3.1.5普通文件3.1.6设备文件3.1.7虚拟文件系统VFS3.1.1Linux下文件的内涵Linux下的文件系统是对复杂系统进行合理抽象的一个经典的例子,它通过一套统一的接口函数对不同的文件进行操作。普通文件字符设备文件块设备文件socket文件3.1.2文件系统的创建在Linux下对磁盘进行操作的工具是fdisk,与Windows下的fdisk功能有些类似,但是命令的格式完全不同。1.系统分区情况2.建立分区3.查看分区是否成功4.格式化分区5.挂载分区6.查看分区挂载情况3.1.3挂接文件系统Linux系统下,要使用一个文件系统需要先将文件系统的分区挂载到系统上。mount命令用于挂载文件,它有很多选项。mount命令的使用格式为:mount–ttypemountpointdevice–ooptions3.1.4索引节点inode索引节点用来存储数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。索引节点为每个文件进行信息索引,所以就有了索引节点的数值。通过查询索引节点,能够快速地找到对应的文件。3.1.5普通文件普通文件是指在硬盘、CD、U盘等存储介质上的数据和文件结构。在本节中所指的文件系统是一个狭义的概念,仅仅按照普通文件在磁盘中组织方式的不同来区分。在Linux下,目录也作为一种普通文件存在。3.1.6设备文件Linux下用设备文件来表示所支持设备,每个设备文件除了设备名,还有3个属性,即类型、主设备号、次设备号。1.字符设备与块设备2.设备文件的创建3.设备文件的简单操作1.字符设备与块设备字符类型的设备可以在一次数据读写过程中传送任意大小的数据,多个字符的访问是通过多次读写来完成的,通常用于访问连续的字符。块类型设备可以随机地访问数据,而数据的访问时间和数据位于设备中的位置无关。常用的块设备有硬盘、软盘和CD-ROM及RAM类型磁盘。2.设备文件的创建设备文件是通过mknod命令来创建的。其命令格式为:mknod[OPTION]...NAMETYPE[MAJORMINOR]

3.设备文件的简单操作设备描述符/dev/console是控制台的文件描述符,可以对其进行操作。3.1.7虚拟文件系统VFSLinux的文件系统是由虚拟文件系统作为媒介搭建起来的,虚拟文件系统VFS(VirtualFileSystems)是Linux内核层实现的一种架构,为用户空间提供统一的文件操作接口。它在内核内部为不同的真实文件系统提供一致的抽象接口。1.文件系统类型2.超级块3.文件操作1.文件系统类型Linux的文件系统用一组通用对象来表示,这些对象是超级块(superblock)、节点索引(inode)、目录结构(dentry)和文件(file)。超级块是每种文件系统的根,用于描述和维护文件系统的状态。inode包含管理文件系统中的对象所需的所有元数据。dentry用来实现名称和inode之间的映射。2.超级块超级块结构用来表示一个文件系统,结构如下:structsuper_block{...unsignedlonglong

s_maxbytes;

/*最大文件尺寸*/structfile_system_type

*s_type;

/*文件的类型*/conststructsuper_operations*s_op;/*超级块的操作,主要是对inode的操作*/...chars_id[32];

/*文件系统的名称*/};3.文件操作在文件fs.h中定义了文件操作的结构,通常实际的文件系统都要实现对应的操作函数,例如打开文件open、关闭文件close、读取数据read和写入数据write等。3.2文件的通用操作方法3.2.1文件描述符3.2.2打开创建文件open()、create()函数3.2.1文件描述符在Linux下用文件描述符来表示设备文件和普通文件。文件描述符是一个整型的数据,所有对文件的操作都通过文件描述符实现。文件描述符的范围是0~OPEN_MAX。在Linux系统中有3个已经分配的文件描述符,即标准输入、标准输出和标准错误,它们文件描述符的值分别为0、1和2。3.2.2打开创建文件open()、create()函数1.函数open()、create()介绍2.使用函数open()的例子1.函数open()、create()介绍intopen(constchar*pathname,intflags);intopen(constchar*pathname,intflags,mode_tmode);2.使用函数open()的例子10 fd=open(filename,O_RDWR); /*打开文件为可读写方式*/3.2.3关闭文件close()函数close()函数关闭一个打开的文件,之前打开文件所占用的资源。1.close()函数介绍2.close()函数的例子1.close()函数介绍close()函数的原型如下:#include<unistd.h>intclose(intfd);2.close()函数的例子3.2.4读取文件read()函数用read()函数从打开文件中读数据,用户可以对读入的数据进行操作。1.read()函数介绍2.read()函数的例子1.read()函数介绍使用这个函数需要将头文件unistd.h加入。read()函数的原型定义格式如下。ssize_tread(intfd,void*buf,size_tcount);2.read()函数的例子14 fd=open(filename,O_RDONLY); /*打开文件,如果文件不存在,则报错*/3.2.5写文件write()函数write()函数向打开的文件中写入数据,将用户的数据保存到文件中。1.write()函数介绍2.write()函数的例子1.write()函数介绍write()的函数原型如下。#include<unistd.h>ssize_twrite(intfd,constvoid*buf,size_tcount);函数操作成功会返回写入的字节数,当出错的时候返回–1。出错的原因有多种,像磁盘已满,或者文件大小超出系统的设置,例如ext2下的文件大小限制为2Gbytes等。2.write()函数的例子23 size=write(fd,buf,strlen(buf)); /*将数据写入到文件test.txt中*/3.2.6文件偏移lseek()函数在调用read()和write()函数时,每次操作成功后,文件当前的操作位置进行了移动。其中隐含了一个概念,即文件的偏移量。文件的偏移量指的是当前文件操作位置相对于文件开始位置的偏移。1.lseek()函数介绍2.lseek()函数的通用例子3.空洞文件的例子1.lseek()函数介绍lseek()函数可以设置文件偏移量的位置,lseek()的函数原型如下:#include<sys/types.h>#include<unistd.h>off_tlseek(intfildes,off_toffset,intwhence);2.lseek()函数的通用例子12 offset=lseek(1,0,SEEK_CUR); /*将标准输入文件描述符的文件偏移量设为当前值*/13 if(-1==offset){ /*设置失败,标准输入不能进行seek操作*/...}3.空洞文件的例子lseek()函数对文件偏移量的设置可以移出文件,即设置的位置可以超出文件的大小,但是这个位置仅仅在内核中保存,并不引起任何的IO操作。当下一次的读写动作时,lseek()设置的位置就是操作的当前位置。当对文件进行写操作时会延长文件,跳过的数据用"\0"填充,这在文件中造成了一个空洞。3.2.7获得文件状态fstat()函数有的时候对文件操作的目的不是读写文件,而是要获得文件的状态。例如,获得目标文件的大小、权限、时间等信息。1.fstat()函数介绍2.stat()函数的例子1.fstat()函数介绍在程序设计的时候经常要用到文件的一些特性值,例如,文件的所有者、文件的修改时间、文件的大小等。stat()函数、fstat()函数和lstat()函数可以获得文件的状态,其函数原型如下:#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>intstat(constchar*path,structstat*buf);intfstat(intfiledes,structstat*buf);intlstat(constchar*path,structstat*buf);2.stat()函数的例子if(-1==stat("test.txt",&st)){ /*获得文件的状态,将状态值放入st中*/3.2.8文件空间映射mmap()函数mmap()函数将文件映射到内存中的某一段,内存比磁盘快些。映射到的内存并不占用空间,仅仅占用一段地址空间。1.mmap()函数介绍2.munmap()函数介绍3.mmap()函数和munmap()函数的例子1.mmap()函数介绍mmap()函数的原型如下。#include<sys/mman.h>void*mmap(void*start,size_tlength,intprot,intflags,

intfd,off_toffset);2.munmap()函数介绍与mmap()函数对应的函数是munmap()函数,它的作用是取消mmap()函数的映射关系。其函数原型如下:#include<sys/mman.h>intmunmap(void*start,size_tlength);3.mmap()函数和munmap()函数的例子29 ptr=(char*)mmap(NULL,FILELENGTH,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);37 munmap(ptr,FILELENGTH); /*取消文件映射关系*/3.2.9文件属性fcntl()函数fcntl()函数用于获得和改变已经打开文件的性质。1.fcntl()函数介绍2.F_GETFL的例子3.F_SETFL的例子4.F_GETOWN的例子5.F_SETOWN的例子1.fcntl()函数介绍fcntl()函数向打开的文件fd发送命令,更改其属性。函数原型如下:#include<unistd.h>#include<fcntl.h>intfcntl(intfd,intcmd);intfcntl(intfd,intcmd,longarg);intfcntl(intfd,intcmd,structflock*lock);2.F_GETFL的例子10

flags=fcntl(0,F_GETFL,0);

/*获得标准输入的状态的状态*/3.F_SETFL的例子14

flags=fcntl(fd,F_SETFL,&flags);

/*将状态写入*/4.F_GETOWN的例子F_GETOWN获得接收信号SIGIO和SIGURG信号的进程ID或进程组ID。09

uid=fcntl

温馨提示

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

评论

0/150

提交评论