您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 兰州大学操作系统实验十一文件系统编程题目和答案
实验十一报告实验名称:11文件系统编程实验目的:1.学习和掌握使用系统调用操作文件和目录的属性、内容的方法实验时间3学时预备知识:1.系统调用文件操作1.1.1open(打开文件)//表头文件#includesys/types.h#includesys/stat.h#includefcntl.h定义函数intopen(constchar*pathname,intflags);返回值:0-127intopen(constchar*pathname,intflags,mode_tmode);函数说明参数pathname指向欲打开的文件路径字符串。下列是参数flags所能使用的标志:O_RDONLY以只读方式打开文件O_WRONLY以只写方式打开文件O_RDWR以可读写方式打开文件。上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用OR(|)运算符组合。O_CREAT若欲打开的文件不存在则自动建立该文件。O_EXCL如果O_CREAT也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。O_NOCTTY如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。O_TRUNC若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失。O_APPEND追加当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。O_NONBLOCK以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。O_NDELAY同O_NONBLOCK。O_SYNC以同步的方式打开文件。直接修改到磁盘上,不经过缓冲区O_NOFOLLOW如果参数pathname所指的文件为一符号连接,则会令打开文件失败。O_DIRECTORY如果参数pathname所指的文件并非为一目录,则会令打开文件失败。参数mode则有下列数种组合,只有在建立新文件时才会生效,此外真正建文件时的权限会受到umask值所影响,因此该文件权限应该为(mode-umaks)。S_IRWXU00700权限,代表该文件所有者具有可读、可写及可执行的权限。S_IRUSR或S_IREAD,00400权限,代表该文件所有者具有可读取的权限。S_IWUSR或S_IWRITE,00200权限,代表该文件所有者具有可写入的权限。S_IXUSR或S_IEXEC,00100权限,代表该文件所有者具有可执行的权限。S_IRWXG00070权限,代表该文件用户组具有可读、可写及可执行的权限。S_IRGRP00040权限,代表该文件用户组具有可读的权限。S_IWGRP00020权限,代表该文件用户组具有可写入的权限。S_IXGRP00010权限,代表该文件用户组具有可执行的权限。S_IRWXO00007权限,代表其他用户具有可读、可写及可执行的权限。S_IROTH00004权限,代表其他用户具有可读的权限S_IWOTH00002权限,代表其他用户具有可写入的权限。S_IXOTH00001权限,代表其他用户具有可执行的权限。返回值若所有欲核查的权限都通过了检查则返回0值,表示成功,只要有一个权限被禁止则返回-1。错误代码EEXIST参数pathname所指的文件已存在,却使用了O_CREAT和O_EXCL旗标。EACCESS参数pathname所指的文件不符合所要求测试的权限。EROFS欲测试写入权限的文件存在于只读文件系统内。EFAULT参数pathname指针超出可存取内存空间。EINVAL参数mode不正确。ENAMETOOLONG参数pathname太长。ENOTDIR参数pathname不是目录。ENOMEM核心内存不足。ELOOP参数pathname有过多符号连接问题。EIOI/O存取错误。1.1.2close(见管道通信)1.1.3read(见管道通信)1.1.4write(见管道通信)1.1.5lseek(移动文件的读写位置)表头文件#includesys/types.h#includeunistd.h定义函数off_tlseek(intfildes,off_toffset,intwhence);函数说明每一个已打开的文件都有一个读写位置,当打开文件时通常其读写位置是指向文件开头,若是以附加的方式打开文件(如O_APPEND),则读写位置会指向文件尾。当read()或write()时,读写位置会随之增加,lseek()便是用来控制该文件的读写位置。参数fildes为已打开的文件描述词,参数offset为根据参数whence来移动读写位置的位移数。参数whence为下列其中一种:SEEK_SET参数offset即为新的读写位置。SEEK_CUR以目前的读写位置往后增加offset个位移量。SEEK_END将读写位置指向文件尾后再增加offset个位移量。当whence值为SEEK_CUR或SEEK_END时,参数offet允许负值的出现。下列是较特别的使用方式:1)欲将读写位置移到文件开头时:lseek(intfildes,0,SEEK_SET);2)欲将读写位置移到文件尾时:lseek(intfildes,0,SEEK_END);3)想要取得目前文件位置时:lseek(intfildes,0,SEEK_CUR);返回值当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno会存放错误代码。附加说明Linux系统不允许lseek()对tty装置作用,此项动作会令lseek()返回ESPIPE。1.1.6fstat(由文件描述词取得文件状态)表头文件#includesys/stat.h#includeunistd.h定义函数intfstat(intfildes,structstat*buf);函数说明fstat()用来将参数fildes所指的文件状态,复制到参数buf所指的结构中(structstat)。Fstat()与stat()作用完全相同,不同处在于传入的参数为已打开的文件描述词。返回值执行成功则返回0,失败返回-1,错误代码存于errno。structstat:列数种情况S_IFMT0170000文件类型的位掩码前三位为8进制S_IFSOCK0140000scoketS_IFLNK0120000符号连接S_IFREG0100000一般文件S_IFBLK0060000区块装置S_IFDIR0040000目录S_IFCHR0020000字符装置S_IFIFO0010000先进先出S_ISUID04000文件的(setuser-idonexecution)位S_ISGID02000文件的(setgroup-idonexecution)位S_ISVTX01000文件的sticky位S_IRUSR(S_IREAD)00400文件所有者具可读取权限S_IWUSR(S_IWRITE)00200文件所有者具可写入权限S_IXUSR(S_IEXEC)00100文件所有者具可执行权限S_IRGRP00040用户组具可读取权限S_IWGRP00020用户组具可写入权限S_IXGRP00010用户组具可执行权限S_IROTH00004其他用户具可读取权限S_IWOTH00002其他用户具可写入权限S_IXOTH00001其他用户具可执行权限上述的文件类型在POSIX中定义了检查这些类型的宏定义S_ISLNK(st_mode)判断是否为符号连接S_ISREG(st_mode)是否为一般文件S_ISDIR(st_mode)是否为目录S_ISCHR(st_mode)是否为字符装置文件S_ISBLK(s3e)是否为先进先出S_ISSOCK(st_mode)是否为socket范例#includesys/stat.h#includeunistd.h#includefcntk.hmain(){structstatbuf;intfd;fd=open(“/etc/passwd”,O_RDONLY);fstat(fd,&buf);printf(“/etc/passwdfilesize+%d\n“,buf.st_size);}文件权限操作1.2.1chown(改变文件的所有者)表头文件#includesys/types.h#includeunistd.h定义函数intchown(constchar*path,uid_towner,gid_tgroup);函数说明chown()会将参数path指定文件的所有者变更为参数owner代表的用户,而将该文件的组变更为参数group组。如果参数owner或group为-1,对应的所有者或组不会有所改变。root与文件所有者皆可改变文件组,但所有者必须是参数group组的成员。当root用chown()改变文件所有者或组时,该文件若具有S_ISUID或S_ISGID权限,则会清除此权限位,此外如果具有S_ISGID权限但不具S_IXGRP位,则该文件会被强制锁定,文件模式会保留。返回值成功则返回0,失败返回-1,错误原因存于errno。错误代码参考chmod()。范例/*将/etc/passwd的所有者和组都设为root*/#includesys/types.h#includeunistd.hmain(){chown(“/etc/passwd”,0,0);}1.2.2chmod(改变文件的权限)表头文件#includesys/types.h#includesys/stat.h定义函数intchmod(constchar*path,mode_tmode);函数说明chmod()会依参数mode权限来更改参数path指定文件的权限。参数mode有下列数种组合S_ISUID04000文件的(setuser-idonexecution)位S_ISGID02000文件的(setgroup-idonexecution)位S_ISVTX01000文件的sticky位S_IRUSR(S_IREAD)00400文件所有者具可读取权限S_IWUSR(S_IWRITE)00200文件所有者具可写入权限S_IXUSR(S_IEXEC)00100文件所有者具可执行权限S_IRGRP00040用户组具可读取权限S_IWGRP00020用户组具可写入权限S_IXGRP00010用户组具可执行权限S_IROTH00004其他用户具可读取权限S_IWOTH00002其他用户具可写入权限S_IXOTH00001其他用户具可执行权限只有该文件的所有者或有效用户识别码为0,才可以修改该文件权限。基于系统安全,如果欲将数据写入一执行文件,而该执行文件具有S_ISUID或S_ISGID权限,则这两个位会被清除。如果一目录具有S_ISUID位权限,表示在此目录下只有该文件的所有者或root可以删除该文件。返回值权限改变成功返回0,失败返回-1,错误原因存于errno。错误代码EPERM进程的有效用户识别码与欲修改权限的文件拥有者不同,而且也不具root权限。EACCESS参数path所指定的文件无法存取。EROFS欲写入权限的文件存在于只读文件系统内。EFAULT参数path指针超出可存取内存空间。EINVAL参数mode不正确ENAMETOOLONG参数path太长ENOENT指定的文件不存在ENOTDIR参数path路径并非一目录ENOMEM核心内存不足ELOOP参数path有过多符号连接问题。EIOI/O存取错误范例/*将/etc/passwd文件权限设成S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH*/#includesys/types.h#includesys/stat.hmain(){chmod(“/etc/passwd”,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
本文标题:兰州大学操作系统实验十一文件系统编程题目和答案
链接地址:https://www.777doc.com/doc-6381969 .html