实验六 Linux下文件程序设计

实验六Linux下文件程序设计

基本信息

实验课程:Linux程序设计              设课形式:非独立

课程学分:2                           实验项目:Linux下文件程序设计

项目类型:验证                        项目学时:2

实验预习

实验目的和要求:

  1. Linux系统的文件属性
  2. 不带缓存的文件I/O操作
  3. 基于流的文件I/O操作
  4. 特殊文件的操作

实验条件:

1、装有Linux操作系统的微型计算机;

实验过程

    1. Linux系统文件的属性
  1. Linux系统中,文件的准确定义是不包含有任何其他结构的字符流。
  2. Linux系统提供的文件系统,是树形层次结构系统。
  3. Linux支持多种文件系统,最常用的文件系统是ext2系统。
  4. Linux系统的文件属性主要包括文件类型和文件权限两个方面。

 

6.1.1Linux文件类型

  1. Linux下最常见的文件类型有5种:普通文件、目录文件、链接文件、管道文件和设备文件。
  2. Linux系统的主要文件类型:

 

例6-1设计一个程序,要求列出当前目录下的文件信息,以及系统“/dev/sda1”和“/dev/lp0”的文件信息。

编辑源程序代码:

 

6.1.2 Linux文件权限

  1. 对于Linux系统中的文件来说,它的权限可以分为4种:可读取(Readable)、可写入(Writable)、可执行(eXecute)和无权限,分别用r、w、x和-表示。
  2. Linux系统按文件所有者、文件所有者同组用户和其它用户三类规定不同的文件访问权限。
  3. 显示的作为权限的10个字符,可分为四部分:
    1. 第一位:一般表示文件类型。
    2. 第二位到第四位(第一组rwx):表示文件所有者的访问权限。
    3. 第五位到第七位(第二组rwx):表示文件所有者同组用户的访问权限。
    4. 第八位到第十位(第三组rwx):表示其他用户的访问权限。
  1. chmod函数说明

  1. mode参数说明

 

例6-2设计一个程序,要求把系统中“/etc”目录下的passwd文件权限,设置成文件所有者可读可写,所有其他用户为只读权限。

 

源程序代码:

 

  1. umask函数说明

6-3设计一个程序,要求设置系统文件与目录的权限掩码。

 

源程序代码

 

注意:运行一次此例的程序后,修改源程序中的掩码后,再次编译运行,文件“liu1”和“liu2”的权限并不改变。因为如果文件已经存在,touch只修改时间标记。如果要再次验证新的掩码,需要再次运行程序前删除原来的文件。

 

思考题:设计一个程序,要求Linux系统新建的文件权限是0400

6.1.3  Linux文件的其他属性

  1. 文件还有创建时间,大小等其他的属性。
  2. Linux系统中,定义了stat结构体来存放这些信息。
  3. 如果要获得文件的其他属性,可以使用stat函数或者fstat函数。
  4. stat函数用来判断没有打开的文件,而fstat函数用来判断打开的文件。使用较多的属性是st_mode,通过此属性可以判断给定的文件是一个普通文件还是其他文件类型。

  1. stat函数说明

6-4设计一个程序,应用系统函数stat获取系统中“/etc”目录下的passwd文件的大小。

 

源程序代码:

 

思考题:

  1. 设计一个程序,要求判断“/etc/passwd”的文件类型。

使用st_mode属性,可以使用几个宏来判断:S_ISLNK(st_mode) 是否是一个连接,S_ISREG是否是一个常规文件S_ISDIR是否是一个目录,S_ISCHR是否是一个字符设备,S_ISBLK是否是一个块设备,S_ISFIFO是否是一个FIFO文件,S_ISSOCK是否是一个SOCKET文件。

  1. 设计一个程序,要求打开文件“/etc/passwd”判断它的最后一次访问时间。

    1. 不带缓存的文件I/O操作
  1. Linux系统中,基于文件描述符的文件操作主要有:不带缓存的文件I/O操作和带缓存的文件流I/O操作。
  2. 不带缓存的文件I/O操作,又称系统调用I/O操作,符合POSIX标准,设计的程序能在兼容POSIX标准的系统间方便地移植。
  3. 不带缓存的文件I/O操作用到的主要函数:

 

6.2.1  文件的创建

  1. creat函数说明

例6-5设计一个程序,要求在“/home”目录下创建一个名称为“6-5file”的文件,并且把此文件的权限设置为所有者具有只读权限,最后显示此文件的信息。

 

源程序代码:

思考题:设计一个程序,要求在“/mnt”目录下创建一个名称为“usb”的文件,编辑、调试成功后,运行两次是否有问题?为什么?

6.2.2  文件的打开和关闭

  1. open函数说明

  1. close函数说明

 

6-6设计一个程序,要求在“/home”下以可读写方式打开一个名为“6-6file”的文件,如果该文件不存在,则创建此文件,如果存在,将文件清空后关闭。

源程序代码:

 

思考题:设计一个程序,要求在“/mnt”目录下,打开名称为“usb”的文件,如果该文件不存在,则创建此文件,如果存在,将文件清空后关闭。

6.2.3文件的读写操作

  1. 文件读写操作中,经常用到的函数是read、write和lseek。
  2. Read、write函数说明

 

 

例6-7设计一个C程序,完成文件的复制工作。要求通过使用read函数和write函数复制“/etc/passwd”文件到“4-7test”文件中,文件名当程序运行时从键盘键入。

源程序代码:

 

 

思考题:

  1. 设计一个程序,使用read函数从源文件读取数据,再用write函数写入到目标文件,源文件名和目标文件名都由键盘输入。

  1. 设计一个程序,要求在“/mnt”目录下,打开名称为“usb”的文件,如果该文件不存在,则创建此文件,如果已存在,把字符串“usb作为优盘设备文件”写入此文件后关闭。

6.2.4文件上锁

  1. Linux系统中,给文件上锁主要有建议性锁和强制性锁。给文件加建议性锁的是flock函数,给文件加强制性锁的是fcntl函数。
  2. 一般情况下,系统使用强制性锁,而很少使用建议性锁。当一个文件被上锁后,内核将阻止其他任何文件对其进行读写操作。
  3. flock、fcntl函数说明

 

例6-8设计一个程序,要求在“/home”下打开一个名为“6-8file”的文件,如果该文件不存在,则创建此文件。打开后对其加上强制性的写入锁,然后释放写入锁。

 

源程序代码:

 

 

 

注意:程序在终端中运行后会暂停,需要按任意健后程序才会继续运行。

思考题:设计一个程序,要求在“/mnt”目录下,打开名称为“usb”的文件,如果该文件不存在,则创建此文件。打开后对其加上强制性的写入锁,然后释放写入锁。

    1. 带缓存的流文件I/O操作
  1. 带缓存的流文件I/O操作,是在内存开辟一个“缓存区”,为程序中的每一个文件使用。
  2. 内存“缓存区”的大小,影响着实际操作外存的次数,内存“缓存区”越大,则操作外存的次数就少,执行速度就快、效率高。
  3. 带缓存的文件I/O操作用到的主要函数

 

6.3.1流文件的打开和关闭

例6-9设计一个程序,要求用流文件I/O操作打开文件“6-9file”,如果该文件不存在,则创建此文件。

源程序代码:

思考题:设计一个程序,要求用带缓存的流文件I/O操作,在“/tmp”目录下,打开名称为“tmpfile”的文件,如果该文件不存在,则创建此文件,如果存在,将文件清空后关闭。

6.3.2  流文件的读写操作

6-10设计一个程序,要求把键盘上输入的字符写入文件“6-10file”如果该文件不存在,则创建此文件。

源程序代码:

 

思考题:

  1. 程序运行后,输入的字符如果是半角的中文,文件中能否写入?为什么?
  2. 设计一个程序,要求用带缓存的流文件I/O操作,利用fputc函数把键盘上输入的字符串写入文件“/tmp/4-10tmp”如果该文件不存在,则创建此文件。

6-11设计一个程序,要求把键盘上输入的字符写入文件“6-11file”如果该文件不存在,则创建此文件。

源程序代码:

 

 

思考题:

  1. 设计一个程序,要求用带缓存的流文件I/O操作,把键盘上输入的字符串写入文件“/tmp/6-11tmp”如果该文件不存在,则创建此文件,多次运行程序多次输入字符串后,文件“/tmp/6-11tmp”中只保存最后一次输入的字符串。

  1. 设计一个程序,要求用带缓存的流文件I/O操作,把文件“/tmp/6-11tmp”中的内容读取出来,在终端中打印输出。

6-12设计两个程序,要求一个程序把三个人的姓名和帐号余额信息,通过一次流文件I/O操作写入文件“6-12file”,另一个格式输出帐号信息,把每个人的帐号和余额一一对应显示输出。

6-12fwrite.c6-12fread.c程序代码

 

 

思考题:

  1. 完善例6-12的程序,使得帐号和余额都可以从键盘输入,余额可以输入小数。
  2. 设计一个程序,要求把一个文本文件“6-12test”中的数据读出,文本文件“6-12test”有两列数据,第一列是帐号(11位整数表示),第二列是帐号余额(double数据类型),两列数据间用逗号隔开,按帐号余额从小到大排序后,把排序后的数据写入文本文件“6-12sort”,帐号要和余额一一对应。

 

6.3.3文件的定位

  1. 实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。文件定位移动文件内部位置指针的函数主要有三个,即rewind 函数、fseek函数和ftell函数。

例6-13设计一个程序,要求用fopen函数打开系统文件“/etc/passwd”,先把位置指针移动到第10个字符前,再把位置指针移动到文件尾,最后把位置指针移动到文件头,输出三次定位的文件偏移量的值。

 

源程序代码:

 

思考题:设计一个程序,要求从系统文件“/etc/passwd”读取偏移量从100200之间的字符,写入“/tmp/pass”文件。

 

    1. 目录与链接文件

6.6.1  目录文件的操作

  1. 目录文件是Linux中一种比较特殊的文件,它是Linux文件系统结构中骨架,对构成整个树型层次结构的Linux文件系统非常重要。
  2. 对目录文件的操作可以使用mkdir函数、opendir函数、closedir函数、readdir函数和scandir函数等。

 

例6-14设计一个程序,要求读取系统目录文件“/etc/rc.d”中所有的目录结构。

 

源程序代码:

 

思考题:设计一个程序,要求读取“/etc” 目录下所有的目录结构,并依字母顺序排列。

 

6.6.2链接文件的操作

  1. Linux系统中的链接文件,有点类似于Windows系统中的“快捷方式”,但并不完全一样。

1.软链接文件

  1. 软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。链接文件甚至可以链接不存在的文件,这就产生一般称之为“断链”的问题,链接文件甚至可以循环链接自己。类似于编程语言中的递归。

2.硬链接文件

  1. 对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容,这时,系统就“忘记”了它曾经是硬链接文件,而把它当成一个普通文件。
  2. 硬链接文件有两个限制:
    1. 不允许给目录创建硬链接;
    2. 只有在同一文件系统中的文件之间才能创建链接。

 

例6-15设计一个程序,要求为“/etc/passwd”文件建立软链接“6-15link”,并查看此链接文件和“/etc/passwd”文件。

源程序代码:

 

思考题:设计一个程序,要求为“/bin”目录文件建立软链接为“bin”,并查看此链接文件和“/bin”目录文件。

6-16设计一个程序,要求为“/etc/passwd”文件建立软链接“6-16link”,并查看此链接文件和“/etc/passwd”文件。

 

源程序代码:

思考题:设计一个程序,要求为“/bin/ls”文件建立硬链接为“ls”,并查看此链接文件和“/bin/ls”文件。

思考与实验

  1. 设计一个程序,要求打开文件“pass”,如果没有这个文件,新建此文件,权限设置为只有所有者有只读权限。

  1. 设计一个程序,要求新建一个文件“hello”,利用write函数将“Linuxc软件设计”字符串写入该文件。

  1. 设计一个程序,要求利用read函数读取系统文件“/etc/passwd”,并在终端中显示输出。

  1. 设计一个程序,要求打开文件“pass”,如果没有这个文件,新建此文件;读取系统文件“/etc/passwd”,把文件中的内容都写入“pass”文件。

  1. 设计一个程序,要求将10分别以十进制、八进制和十六进制输出。

  1. 设计一个程序,要求新建一个目录,预设权限为-x--x--x--

  1. 设计一个程序,要求为“/bin/ls”文件建立一个软链接“ls1”和一个硬链接为“ls2”,并查看两个链接文件和“/bin/ls”文件。

心得体会

写C语言程序的时候,虽然相对来说熟悉,遇到了相当多的问题,可是越写到后面,才知道我犯的错误是多么小,虽然一开始编译很多错误,但实际上就是空格和中英文符号的错误,以及有些程序缺少头文件,我就纳闷了,为什么输入输出语句里面只要还有双引号,就得用中文双引号,这跟我之前学的常识不太一样,所以在这种小问题上浪费了很久的时间。

  • 20
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值