new-第5章文件系统

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Linux文件系统编程目录3思考与实验1.设计一个程序,要求打开文件“pass”,如果没有这个文件,新建此文件,权限设置为只有所有者有只读权限。2.设计一个程序,要求新建一个文件“hello”,利用write函数将“Linux下C软件设计”字符串写入该文件。3.设计一个程序,要求利用read函数读取系统文件“/etc/passwd”,并在终端中显示输出。4.设计一个程序,要求打开文件“pass”,如果没有这个文件,新建此文件;读取系统文件“/etc/passwd”,把文件中的内容都写入“pass”文件。4思考与实验5.设计一个程序,要求将10分别以十进制、八进制和十六进制输出。6.设计一个程序,要求新建一个目录,预设权限为---x--x--x。7.设计一个程序,要求为“/bin/ls”文件建立一个软链接“ls1”和一个硬链接为“ls2”,并查看两个链接文件和“/bin/ls”文件。55本章重点Linux系统的文件属性system(),chmod(),umask(),S_IRUSR不带缓存的文件I/O操作获取文件状态stat();基于流的文件I/O操作特殊文件的操作65.1Linux系统文件和文件系统linux文件系统结构75.1.1Linux文件类型用ls命令长列表显示文件类型含义如表5.1所示文件及目录函数ChmodumaskStat9105.1.1Linux文件类型Linux文件类型分为普通文件、目录文件、符号链接(symboliclink)文件、设备文件、管道文件、socket文件等。例5.1设计一个程序,要求列出当前目录下的文件信息,以及系统“/dev/sda1”和“/dev/lp0”的文件信息。步骤1编辑源程序代码。[root@localhostroot]#vi5-1.c115.1.1Linux文件类型125.1.1Linux文件类型步骤2用gcc编译程序。[root@localhostroot]#gcc5-1.c–o5-1步骤3运行程序。[root@localhostroot]#./5-1列出当前目录下的文件信息:-rwxr-xr-x2rootroot122557月1104:22file01-rw-r--r--1rootroot7867月1104:21file02drwxr-xr-x7rootroot40965月1104:21file03lrwxrwxrwx1rootroot117月1104:20file04-etc/passwd-rwxr-xr-x2rootroot122557月1104:22file05列出“/dev/sda1”的文件信息:brw-rw----1rootdisk8,12003-01-30/dev/sda1列出“/dev/lp0”的文件信息:crw-rw----1rootlp6,02003-01-30/dev/lp013135.1.2文件权限Linux系统是一个多用户系统。为了保护系统中文件的安全,Linux统对不同用户访问同一文件的权限做了不同的规定。对于Linux系统中的文件来说,它的权限可以分为四种:可读取(Read)、可写入(Write)、可执行(eXecute)和无权限,分别用r、w、x和-表示。例5.2设计一个程序,要求把系统中“/etc”目录下的passwd文件权限,设置成文件所有者可读可写,所有其他用户为只读权限。145.1.2文件权限chmod函数说明:155.1.2文件权限mode参数说明:U,G,O的所有权限:S_IRWXU;S_IRWXG;S_IRWXO165.1.2文件权限步骤1编辑源程序代码。[root@localhostroot]#vi5-2.c程序代码如下:/*5-2.c设置“/etc/passwd”文件权限*/#includesys/types.h/*文件预处理,包含chmod函数库*/#includesys/stat.h/*文件预处理,包含chmod函数库*/intmain()/*C程序的主函数,开始入口*/{chmod(/etc/passwd,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);/*S_IRUSR表示拥有者具有读权限,S_IRGRP表示组内人具有读权限,S_IROTH表示其他人具有读权限*/return0;}175.1.2文件权限步骤2用gcc编译程序。[root@localhostroot]#gcc5-2.c–o5-2步骤3运行程序。[root@localhostroot]#./5-2如果程序没有出错,此时系统中没有任何显示。步骤4使用ls–l命令来查看“/etc/passwd”文件的权限。[root@localhostroot]#ls-l/etc/passwd-rw-r--r--1rootroot16353月1500:20/etc/passwd185.1.2文件权限umask函数说明:思考题:设计一个程序,要求Linux系统新建的文件权限是0400,提示umask中的参数设置为0266。195.1.2文件权限例5.3设计一个程序,要求设置系统文件与目录的权限掩码。分析先将系统的权限掩码改为0666(指建立文件时预设的权限为0000),然后调用touch命令新建文件liu1;接着将系统的权限掩码设为0444(指建立文件时预设的权限为0222),然后调用touch命令新建文件liu2;最后调用ls命令观察这些文件的权限,是否按题意的要求已实现。步骤1编辑源程序代码。[root@localhostroot]#vi5-3.c205.1.2文件权限215.1.2文件权限上述结果说明如下:1)先将系统的权限掩码为0666,所以新建的文件liu1访问权限为0000,即“--------”。2)再将系统的权限掩码为0444,所以新建的文件liu2访问权限为0222,即“--w--w--w-”。语句system(touchliu1)的作用是调用system函数来运行shell命令“touchliu1”,touch命令的作用是更改时间标记,若文件不存在,则新建文件。运行一次此例的程序后,修改源程序中的掩码后,再次编译运行,文件“liu1”和“liu2”的权限并不改变。因为如果文件已经存在,touch只修改时间标记。如果要再次验证新的掩码,需要再次运行程序前删除原来的文件。文件属性的操作1、判断文件的属性2、修改文件的属性(1)改变文件的所有者与修改文件的权限(2)修改文件的其他属性1)重命名:2)修改文件长度判断文件属性的操作1、判断文件的属性#includeunistd.hintaccess(constchar*pathname,intmode);pathname:是文件名称,mode是我们要判断的属性。可以取以下值或者是他们的组合。R_OK文件可以读,W_OK文件可以写,X_OK文件可以执行,F_OK文件存在。当我们测试成功时,函数返回0,否则如果有一个条件不符时,返回-1。判断文件属性的操作如果要获得文件的其他属性,可以使用函数stat或者fstat。#includesys/stat.h#includeunistd.hintstat(constchar*file_name,structstat*buf);//(其中参数stat的结构见inode)intfstat(intfiledes,structstat*buf);stat用来判断没有打开的文件,而fstat用来判断打开的文件.文件属性的操作2、修改文件的属性(1)改变文件的所有者与修改文件的权限1)改变文件的所有者:文件属性的操作chown改变path指定的文件所有者和所属组,将会更改symbolic-link指向的文件,lchown不更改symbolic-link指向的文件。fchown改变fd指定文件的所属组和用户。进程必需具有CAP_CHOWN能力才能更改所有者,文件所有者可以更改文件所属组为自己是成员的组,拥有CAP_CHOWN可以更改所属组为任意组。当进程是非超级用户权限进程时,成功调用此函数将自动清除文件的set-user-id和set-group-id位。返回值:成功返回0,否则-1,并设置errno。文件属性的操作2)修改文件权限如下:参数mode有下列数种组合描述符文件属性的操作文件属性的操作(2)修改文件的其他属性1)重命名:intrename(constchar*oldname,constchar*newname);函数说明(1)如果oldname为一个文件而不是目录,那么为该文件更名。如果newname已存在,而且不是一个目录,则先将其删除然后将oldname更名为newname。如果newname作为一个目录已存在,则它不能重命名一个目录。文件属性的操作(2)如若oldname为一个目录,那么为该目录更名。如果newname已存在,则它必须是一个目录,而且该目录应当是空目录(空目录指的是该目录中只有.和..项)。如果newname存在(而且是一个空目录),则先将其删除,然后将oldname更名为newname。另外,当为一个目录更名时,newname不能包含oldname作为其路径前缀。例如,不能将/usr更名为/usr/foo/testdir,因为老名字(/usr/foo)是新名字的路径前缀,因而不能将其删除。(3)作为一个特例,如果oldname和newname引用同一文件,则函数不做任何更改而成功返回。返回值:执行成功则返回0,失败返回-1,错误原因存于errno文件属性的操作5、renamefile.c将一个文件重命名为另一个文件文件属性的操作2)修改文件长度inttruncate(constchar*path,off_tlength);函数说明:truncate()会将参数path指定的文件大小改为参数length指定的大小。如果原来的文件大小比参数length大,则超过的部分会被删除。返回值:执行成功则返回0,失败返回-1,错误原因存于errno文件属性的操作2)修改文件长度intftruncate(intfd,off_tlength);将参数fd指定的文件大小改为参数length指定的大小。参数fd为已打开的文件描述词,而且必须是以写入模式打开的文件。如果原来的文件大小比参数length大,则超过的部分会被删去。返回值:执行成功则返回0,失败返回-1,错误原因存于errno。34要获得文件的其他属性,可以使用stat函数、fstat或lstat函数。5.1.3Linux文件的其他属性355.1.3Linux文件的其他属性在Linux系统中,文件还有创建时间、大小等其他的属性。这些信息定义在stat结构体中。stat结构的定义如下:structstat{dev_tst_dev;/*文件所在设备的ID*/ino_tst_ino;/*索引节点号*/mode_tst_mode;/*文件保护模式*/nlink_tst_nlink;/*文件的连接数(硬连接)*/uid_tst_uid;/*用户ID*/gid_tst_gid;/*组ID*/dev_tst_rdev;/*设备号,针对设备文件*/off_tst_size;/*文件字节数*/unsignedlongst_blksize;/*系统块的大小*/unsignedlongst_blocks;/*文件所占块数*/time_tst_atime;/*最后一次访问时间*/time_tst_mtime;/*最后一次修改时间*/time_tst_ctime;/*最后一次改变时间(指属性)*/};st_mode描述了文件的类型和权限两个属性。st_mode是个32位的整型变量,不过现在的linux操作系统只用了低16位。在现代linux操作系统上文件类型共分为7种,分别是:普通文件(regularfile)、目录(directory)、字符设备(

1 / 150
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功