实验四 LINUX文件系统编程
一、Linux常用文件命令
(一)实验目的
1.加深对文件,目录,文件系统等概念的理解。
2.掌握Linux文件系统的目录结构。
3.掌握有关Linux文件系统操作的常用命令。
4.了解有关文件安全方面的知识。
(二)实验准备
文件及其分类
文件是Linux用来存储信息的基本结构。一个文件就是被命名的一组信息。
Linux文件通常分为普通文件、目录文件、特别文件、链接文件。
特别文件分为块特别文件(如磁盘、磁带、CD-ROM等)和字符特别文件(如终端、打印机等)。块特别文件与字符特别文件的类型标志分别是“b”和“c”。
例如:
普通文件 -rw-rw-r--
目录文件 drwxrwx---
块特别文件 brw-rw----
字符特别文件 crw-rw-rw-
(三)实验内容
1.浏览文件系统
(1)运行pwd命令,确定你当前的工作目录。
(2)利用以下命令显示当前工作目录的内容:ls –l
照屏幕上的现实信息,理解各字段的含义。
(3)运行以下命令:ls –ai
观察显示的信息。注意列出的前两项,它们分别表示当前目录和父目录。
使用不带-a选项的ls命令,注意,不再显示隐藏文件了。
使用不带-i选项的ls命令,注意,文件的i节点号不再出现。
(4)使用mkdir命令建立一个子目录subdir。
(5)使用带-d选项的ls命令,你只能看到有关子目录的信息。
(6)使用cd命令,将工作目录改到根目录(/)上。命令格式:cd /
(7)使用ls命令列出根目录的内容,再分别列出各子目录的内容。
步骤:①cd /;②ls;
③ls+子目录名或者cd+子目录名进入子目录后,用ls命令查看。
(8)使用ls -l命令列出/dev的内容,注意各行第一个字符b和c的含义以及规定的访问权限。
(9)使用不带参数的命令cd,然后用pwd命令确定你当前的工作目录是什么。
(10)使用命令cd .. /..,你将工作目录移到什么地方。这个命令同cd /。注意cd .. /..(/前有空格)和cd ../..(/前无空格)的区别。
2.查看你的文件
(1)利用cd命令,将工作目录改到你的主目录上。命令格式:cd+目录名;
(2)将工作目录改到你的子目录subdir,然后运行命令:
date > file1
将当前日期和时间存放到新建文件file1中。
具体步骤:①mkdir subdir;②cd subdir;③date>file1;
(3)使用cat命令查看file1文件的内容。
(4)利用man命令显示date命令的用法:
man date
(5)将date命令的用法附加到文件file1的后面:
man date >> file1
(6)利用cat命令显示文件file1的内容。你会看到,前面date命令的输出和有关date命令的用法的信息都在这个文件中。
(7)利用ls -l file1命令列出文件file1的较详细的信息,注意其中第二字段(链接计数)的值。
(8)利用ln file1../fa命令进行文件链接。然后运行ls -l file1,查看显示的第二段的值发生了什么变化。
(9)现在想利用cat fa命令显示文件fa的内容,应该如何改动工作目录?
(10)设你的主目录是/usr/student,利用ln -s /usr/student/file1 slink进行符号连接。然后,利用ls -l file1 slink显示有关file1和slink的信息。
(11)运行ls -l/bin命令显示目录的内容。
(12)利用ls -l/bin|more命令行分屏显示/bin目录的内容。
3.文件操作
(1)查找文件和目录
利用find命令可以查找文件和目录的位置。你要告诉系统你想查找的文件名和从哪个目录开始进行查找。其常用使用格式是:
find pathname -name filename -print
其中,pathname是指定开始查找的目录,filename是你要查找的文件或目录。-name和-print是find命令的选项。例如:find . –name ‘f*’ –print,在当前目录的父目录的所有子目录中查找名字以f开头的文件名。要查找的文件名模式‘f*’必须用引号括起来,因为其中用到shell的元字符(*)。
(2)查找文件中指定的模式
grep命令常用于文本文件中查找给定的词或短语。包含给定模式字符串的行在标准输出(即显示器)上显示出来。例如:grep root/etc/passwd,在口令文件etc/passwd中查找名称为root的用户是否为和服的用户。
4.文件存取权限
(1)存取权限。Linux系统对所有文件设置了存取权限。存取权限让你确定谁可以对你的个人文件和目录进行访问,以及可以进行什么操作。
把所有用户分为三类:
——文件主(user),即文件的属主。
——组用户(group),即文件组的成员。
——其他用户(other),即能对系统进行访问的所有其他用户。
对一个文件的存取权限分为三种:
——读(r)
——写(w)
——执行(x)
一组存取权限以及相应的文件类型统称为文件模式。如:rw-r--r--表示文件主有读和写的权限,同组用户和其他用户只有读权限。
(2)文件存取权限
读权限(r):允许指定的用户可以打开文件并阅读其内容。如cat,more,file和cp命令等。
写权限(w):允许指定的用户可以打开文件并修改其内容。如vi,mail,cp等。
执行权限(x):允许指定的用户运行(即执行)一个二进制文件或者把一个shell脚本文件当作命令来运行。当你通过输入命令名来调用命令时,你必须具有该命令文件的执行权限。
(3)目录存取权限
读权限(r):允许你列出相应目录中所存放的文件的名字(即目录的内容表)。
写权限(w):允许你从目录中删除已有文件或者把新文件添加到目录中。
查询权限(x):允许你在目录中进行查找和使用cd命令把工作目录放到它这里。
(4)修改文件权限
文件主或root用户可以使用chmod命令来修改文件或目录的权限。修改文件权限的方式有两种:符号模式和绝对模式。
符号模式
使用chmod命令修改当前权限设置的一般形式是:
chmod key file [file...]
其中,key由以下成分组成:
[who] [+|-|=] [mode]
——who这一部分可以由下面的一个和多个字符组成:u,g,o或a,它们分别表示文件主,组用户,其他用户或所有三种用户。默认值是a。
——第二部分必须是以下三个字符中的一个:+,-,或者=,分别表示增加,删除或者设定。
——mode成分可以由以下字符任意组合:r,w或x,分别表示读,写或者执行/查询的权限。
以上三个部分必须依次输入,而且它们之间没有空格。在一个命令行中可以指定多个key,彼此间用逗号隔开,中间没有空格。
如:设文件f原来的权限是rw-rw-r--,现在想让所有用户都具有执行权限,则可使用以下命令:
chmod a+x f
该命令执行后,文件f的权限变成rwxrwxr-x。
练习:首先使用ls –l命令查看文件file1的存取权限。然后用命令 chmod g –r o –r file1修改file1的权限——组用户和其他用户都能被取消对该文件的读权限。最后使用命令ls –l file1核查文件file1存取权限的变化情况。
二、LINUX文件系统编程
(一)实验目的:
(1)掌握LINUX文件系统的基本原理,结构和实现的方法
(2)掌握LINUX文件系统中文件的建立,打开,读写,执行,属性等系统调用的使用.
(二)实验内容:
(1)仔细阅读提供的源代码
(2)理解LINUX文件系统的基本原理
(3)调试提供的源代码
(三)实验程序:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<syslog.h>
#include<string.h>
#include<stdlib.h>
#define MAX 128
int chmd();
int chmd ()
{
int c;
mode_t mode=S_IWUSR;
printf(" 0. 0700\n 1. 0400\n 2. 0200 \n 3. 0100\n ");
printf("Please input your choice(0-3):");
scanf("%d",&c);
switch(c)
{
case 0: chmod("file1",S_IRWXU);break;
case 1: chmod("file1",S_IRUSR);break;
case 2: chmod("file1",S_IWUSR);break;
case 3: chmod("file1",S_IXUSR);break;
default:printf("You have a wrong choice!\n");
}
return(0);
}
main()
{
int fd;
int num;
int choice;
char buffer[MAX];
struct stat buf;
char* path="/bin/ls";
char* argv[4]={"ls","-l","file1",NULL};
while(1)
{
printf("********************************\n");
printf("0. 退出\n");
printf("1. 创建新文件\n");
printf("2. 写文件\n");
printf("3. 读文件\n");
printf("4. 修改文件权限\n");
printf("5. 查看当前文件的权限修改文件权限\n");
printf("********************************\n");
printf("Please input your choice(0-6):");
scanf("%d",&choice);
switch(choice)
{
case 0:close(fd);
exit(0);
case 1:
fd=open("file1",O_RDWR|O_TRUNC|O_CREAT,0750);
if(fd==-1)
printf("File Create Failed!\n");
else
printf("fd = %d\n",fd);
break;
case 2:
num=read(0,buffer,MAX);
write(fd,buffer,num);
break;
case 3:
read(fd,buffer,MAX);
write(1,buffer,num);
break;
case 4:
chmd ();
printf("Change mode success!\n");
break;
case 5:
execv(path,argv);
break;
default:
printf("You have a wrong choice!\n");
}
}
}
回答问题:
(1)程序分析
(2)num=read(0,buffer,MAX); write(fd,buffer,num);代码的含义?
(3)系统调用execv()的用途?
(4)心得体会
《操作系统原理》
实验报告