(Linux部分)
班级:
姓名:
2.3 Linux并发程序设计
(实验估计时间:90分钟)
背景知识
实验目的
工具/准备工作
实验内容与步骤
背景知识
管道是Linux中最常用的进程间通信IPC机制。利用管道时,一个进程的输出可成为另外一个进程的输入。当输入输出的数据量特别大时,这种IPC机制非常有用。可以想象,如果没有管道机制,而必须利用文件传递大量数据时,会造成许多空间和时间上的浪费。
在Linux中,通过将两个file结构指向同一个临时的索引节点,而两个索引节点又指向同一个物理页而实现管道。
实验目的
1) 通过在Linux进程之间进行的通信实例来学习并发程序设计的方法。
2) 通过Linux进程通信的程序设计与实现,进一步熟悉操作系统的进程概念,理解Linux进程管理概念。
3) 通过阅读和分析Linux实验程序,学习Linux程序设计、调试和运行的方法。
工具/准备工作
在开始本实验之前,请回顾教科书的相关内容。
需要准备一台运行Linux操作系统的计算机。
实验内容与步骤
并发程序的设计关键是使用创建进程的系统调用,使一个程序运行时可以生成几个同时运行的程序,如果程序中没有创建进程的动作则为顺序程序设计。
本实验中的并发程序例子完成两个程序child和father之间的数据传递工作,具体做法分为四步。
步骤1:编制并发程序pipeline.c。
单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为pipeline.c。
在该程序中定义管道和文件描述符,并且创建子进程child。该程序用到的系统调用有pipe() 、dup() 、fork() 、close、execl() 、exit,它们的功能分别是建立管道、复制文件描述符、创建进程并使子进程与父进程有相同的程序正文、关闭文件描述符、用指定文件覆盖调用程序、撤销当前进程。
清单4-5 pipeline.c
// 定义管道程序
# define STD_INPUT 0 // 定义标准输入设备描述符
# define STD_OUTPUT 1 // 定义标准输出设备描述符
int fd[2];
main()
{
static char process1[]="father",process2[]="child";
pipe(fd); // 定义管道
pipeline(process1,process2); // 调用自定义函数pipeline()
pipeline();
exit(1); // 程序结束
}
pipeline(char* process1,char* process2)
{
int i;
while ((i=fork())==-1); // 创建进程,直到创建成功为止
if (i)
{
close(fd[0]); // 关闭管道输入描述符
close(STD_OUTPUT); // 关闭标准输出描述符1
dup(fd[1]); // 指定标准输出描述符1为管道写指针
close(fd[1]); // 关闭原始管道写指针
execl(process1, process1, 0); // 用程序father覆盖当前程序
printf(" father failed.\\n"); // execl()执行失败
}
else
{
close(fd[1]); // 关闭管道输出描述符
close(STD_INPUT); // 关闭标准输入描述符0
dup(fd[0]); // 指定标准输入描述符0为管道读指针
close(fd[0]); // 关闭原始管道读指针
execl(process2,process2,0); // 用程序child覆盖当前程序
printf("child failed.\\n"); // execl()执行失败
}
exit(2); // 程序结束
}
步骤2:编制“管道写”程序father.c作为父进程的一部分工作。其内容如下:
单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为father.c。
清单4-6 father.c
main()
{
static char string[] = “Parent is using pipe write.” ;
int len;
len = sizeof(string) ;
write(l, string, len) ; /* 将string中的内容写入管道中 */
printf(“parent, parent, parent \\n \\n \\n” ) ;
exit(0) ;
}
步骤3:编制“管道读”程序child.c作为子进程的一部分工作。其内容如下:
单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为child.c。
清单4-7 child.c
main()
{
char output[30] ;
read (0, output, 30) ; /* 从管道中读数据并存入output中 */
printf(“%s \\n child, child. \\n” , output) ;
return(0) ;
}
步骤4:编译。
Gcc –g pipeline.c –o pipeline
Gcc –g father.c –o father
Gcc –g child.c –o child
步骤5:运行。
./pipeline ./father ./child
若运行不成功,则应该用文本编辑器对源程序进行修改调试。
运行显示结果为:
child failed . 断开的管道
Parent is using pipe write. parent, parent, parent
输入的字符 child,child.
2.4 Linux重定向和管道
(实验估计时间:90分钟)
背景知识
实验目的
工具/准备工作
实验内容与步骤
可选练习
背景知识
在本实验中,我们将使用高级Linux命令来完成重定向和管道。每一个Linux命令都有一个源作为标准输入,一个目的作为标准输出。命令的输入通常来自键盘 (尽管它也可以来自文件) 。命令通常输出到监视器或者屏幕上。Linux计算环境使用重定向可以控制命令的I/O。当试图把命令的输出保存到一个文件,以供以后查看的时候是很有用的。通过管道,可以取得一个命令的输出,把它作为另一个命令的进一步处理的输入。
有几个元字符可用于输入/输出重定向符号:输出重定向使用右尖括号 (>,又称大于号) ;输入重定向使用左尖括号 (<,又称小于号) ;出错输出重定向使用右尖括号之前有一个数字2 (如2>) 。本实验重点在输出重定向。
重定向命令的格式是:
Command Redirection-Symbol File (text file or device file)
标准输出比标准输入或标准出错更经常被重定向。许多命令,如ls、cat、head和tail产生标准输出到屏幕上,常常会希望把这个输出重定向到一个文件中,以便将来查看、处理或者打印。通过替换文件名,可以截获命令的输出,而不是让它到达默认的监视器上。
最强大的元字符之一是管道符号 (|) 。管道取得一个命令的标准输出,把它作为标准输入传递给下一个命令 (通常为more命令、lp (行式打印机) 命令或者一个文件处理命令,如grep或sort) 。必须在管道的每边都有一个命令,命令和管道之间的空格是可选的。
管道命令的格式是:
command | command
实验目的
通过重定向和管道操作:
1) 熟悉输入/输出 (I/O) 重定向;
2) 把标准输出重定向创建一个文件;
3) 防止使用重定向的时候覆盖文件;
4) 把输出追加到一个现有的文件中;
5) 把一个命令的输出导入到另一个命令中。
工具/准备工作
在开始本实验之前,请回顾教科书的相关内容。
您需要做以下准备:
1) 由指导老师分配的登录用户名 (如user2) 和口令。
2) 一台运行Red Hat Linux操作系统,带有GNOME的计算机。
实验内容与步骤
1. 使用重定向标准输出符号
2. 使用管道符号
在本实验中将会用到下列命令:
pwd: 显示当前的工作路径。
cd: 改变目录路径。
ls: 显示指定目录的内容。
more: 分页显示文件的内容。这是用于显示文本文件的首选方法。
head: 截取显示文件的开头部分 (默认为开头10行) 。
tail: 截取显示文件的结尾部分 (默认为最后10行) 。
cal: 有关日历的命令。
set: shell特性的设置。
echo: 显示变量的值。
ps: 显示当前进程。
data: 显示或设置系统日期和时间。
grep: 查找文件中有无指定的关键字。
提示:如果对命令的格式不清楚,可以用man命令请求帮助,即:
| man more |
步骤1:开机,登录进入GNOME。
在GNOME登录框中填写指导老师分配的用户名和口令并登录。
步骤2:访问命令行。
单击红帽子,在“GNOME帮助”菜单中单击“系统工具”-“终端”命令,打开终端窗口。
1. 使用重定向标准输出符号
步骤3:重定向标准输出,创建一个文件。
右尖括号或称大于符号 (>) 把命令的输出发送到一个文件中:使用单个右尖括号,当指定文件名不存在的时候,将创建一个新文件;如果文件名存在,它将被覆盖。(注意:命令、重定向符号和文件名之间的空格是可选的) 。
重定向标准输出命令的格式是:
command > file
1) 为核实当前所在目录位置,使用什么命令?
pwd
如果当前位置不在主目录中,使用什么命令可以改变到主目录中?
cd
2) 如果希望把文件和目录列表截获,存储为主目录中的一个文件,这样可以追踪主目录中有什么文件。使用什么命令,把长文件列表的输出重定向,创建一个叫做homedir.list的文件。
ls> homedir.list
3) 新文件homedir.list被放在哪里?
/home/student
使用ls命令核实新文件存在。
4) 使用什么命令,以一次一屏的方式,来查看刚才创建的文件内容?
ls –l| more homedir.list
5) 使用head命令截获homedir.list文件的前10行,通过重定向,创建一个叫做dhomedir.list-top-10的新文件。应该使用什么命令?
head -10 homedir.list >dhomedir.list-top-10
使用more命令查看文件的内容。
6) 使用tail命令,截获homedir.list文件的最后10行,通过重定向,创建一个叫做dhomedir.list-top-10的新文件。使用什么命令?
tail -10 homedir.list >dhomedir.list-top-10
使用more命令查看文件的内容。
7) 截获cal -y命令的输出,把它存到名为calendar的文件中。查看文件的内容。截获了什么
cal –y>calendar |more calendar
截获了2011年12个月的日历
8) 截获cal 2010命令的输出,把它存到名为calendar的文件中。查看文件的内容。其中有什么内容?
cal 2010>calendar |more calendar
日历有什么变化?
日历的内容变成2010年的了
步骤4:防止使用重定向的时候覆盖文件。
在bash shell中,一个叫做noclobber的选项可以用来设定防止在重定向的过程中覆盖文件。可以在命令行中使用$set -o noclobber命令来完成。o代表选项。
为了重新激活clobber特性,使用$set -o noclobber;撤消则用set +o noclobber。
如果你使用的是csh shell,为了激活/撤消C shell中的clobber特性,使用set noclobber和unset noclobber。
1) 输入命令,打开shell中的noclobber选项。输入什么命令?
set –o noclobber
2) 输入命令ls -l > homedir.list,结果是什么?
bash: homedir.list: cannot overwrite existing file
3) 输入命令ls -l > homedir.list2,结果是什么?
出现了一个新的名为homedir.list2的文件
步骤5:向现有的文件追加输出。
如果想向一个现有的文件追加 (添加到末尾) 文本而不是覆盖它,可以使用双右尖括号 (>>) 。这个选项当文件不存在的时候,会创建一个新文件,或者追加到已有文件。
追加命令的格式是:
command >> file
1) 输入命令,显示“Happy Bday”一行字,使用重定向符号截获输出,把它存到叫做bday4me的文件中。使用什么命令?
echo “Happy Bday” >> bday4me
2) 输入命令,显示 一行字,使用双重定向符号,把输出追加到bday4me文件中。查看bday4me文件的内容。其中有什么?
echo “你好” >> bady4me
3) 输入命令,显示您出生年月的日历 (如果在1985年的6月出生,输入cal 6 1985) ,使用双重定向符号,把输出追加到bday4me文件中。使用什么命令?
Cal 12 19 >> bady4me
4) 查看bday4me文件的内容。注意这3个命令的输出在bday4me文件中已经被组合起来了。您是在一周中的哪一天出生的?
周五
2. 使用管道符号
步骤6:把命令的输出导入到另一个命令中。
1) 使用管道元字符,发送ls -l命令的输出,作为more命令的输入 (注意:如果在当前目录中没有太多的文件,使用 /etc目录获取长列表) 。把输出作为more命令的输入的时候,得到什么结果?
结果以一屏一次的方式显示在屏幕上
2) 查看使用ls –l | more命令列出来的文件,注意创建或修改的日期。为了查看在同一个月被创建或修改的文件或目录的列表,可以使用grep命令对那个月进行搜索。当月份显示在列表中的时候,指定它 (例如:Oct) 。输入命令ls -1 | grep Oct (或者想查找的月份) 。结果是什么?
只显示10月份创建的目录
3) 目录总是4096字节大小。输入命令ls -1 | grep 4096。产生的列表是什么?
4096字节大小的目录显示
4) 可以使用多个管道连接多个命令。输入取得长文件列表输出的命令,把它输入给tail命令,然后到sort命令。输入的命令是:
ls –l| tail| sort
5) ps (进程状态) 命令用于查看Linux系统中运行什么进程。把ps -e命令的输出输入给more命令。-e选项将给出每一个在系统中运行的进程。把输出输入到more命令中的结果是什么?
系统中运行的所有程序
步骤7:删除在本实验中创建的文件和目录。
步骤8:关闭终端窗口,注销。
可选练习
1. 使用set -o命令不指定任何选项,可以查看noclobber特性是否已经打开。
1) 输入set -o。noclobber特性打开还是关闭的?如果它是关闭的,打开它。使用什么命令?
关闭的;set –o noclobber
2) 永久的关闭noclobber特性。使用什么命令?
set +o noclobber
2. 可以把管道和重定向组合起来使用,达到特殊的效果。输入命令创建一个名为top5.list的文件,内容为主目录中的头5行记录,使用什么命令?
ls –l| head -5>top5.list
3.4 管理Linux系统进程
(实验估计时间:90分钟)
背景知识
实验目的
工具/准备工作
实验内容与步骤
背景知识
在本实验中,我们将使用Linux命令工作,来标识和控制系统进程。Linux操作系统使用进程管理作业,进程由系统或者用户初始化。用户在Linux环境下执行的作业大多数都会启动一个进程。进程可以启动或者派生一个子进程,这样创建了一个进程层次结构或者进程树,类似于具有父子关系的文件系统层次结构。
可以使用ps (进程状态) 命令工作,监控系统进程,使用kill命令终止不想要的进程。
实验目的
1) 回顾系统进程的概念,加深对Linux / UNIX进程管理的理解。
2) 回顾ps命令和选项。
3) 列出当前shell中的进程。
4) 列出运行在系统中的所有进程。
5) 根据命令名搜索特定的进程。
6) 确定一个进程,终止它。
7) 使用kill命令终止进程。
8) 根据用户查找和终止进程。
9) 根据命令名终止进程。
工具/准备工作
在开始本实验之前,请回顾教科书的相关内容。
您需要做以下准备:
1) 由指导老师分配的登录用户 ID (如user2) 和口令。
2) 一台运行Red Hat Linux操作系统的计算机。
实验内容与步骤
步骤1:登录进入GNOME。
在Linux登录框中填写指导老师分配的用户名和口令,登录Linux系统。
步骤2:访问命令行。
单击红帽子,在“GNOME帮助”菜单中单击“系统工具”-“终端”命令,打开“终端”窗口。
步骤3:回顾系统进程概念。
每个运行的程序都会创建一个进程,进程分配到一个唯一的进程标识符 (PID) 。PID被系统用于标识和跟踪进程,直到进程结束。操作系统内核管理所有进程的初始化和终止。每一个进程都要求系统资源 (例如CPU时间和RAM空间) 在其中工作。当进程启动的时候,操作系统把系统资源分配给每个进程,当进程终止的时候,系统回收这些资源。在Linux系统启动的时候,首先启动的两个进程是sched (调度) 和init (初始化) ,它们管理着其他进程。Linux系统中有几种不同类型的进程:
守护进程:由Linux内核启动的进程,为了特定目的而存在。例如,lpsched守护进程存在只是为了处理打印作业。
父进程:派生其他进程的进程是父进程。一个叫做init的守护进程是第一个调用的进程。每一个进程,除了init之外,都有一个父进程。
子进程:由其他进程派生出来的进程叫做子进程。
孤儿进程:在进程返回输出之前,它的父进程结束了,这样的进程叫做孤儿进程。
僵进程:子进程没有带着输出返回给父进程。这样的进程在系统中变成丢失的进程。
使用此前的信息,完成以下填空:
1) Linux系统中,几乎每一个启动的进程,都会由内核分配一个唯一的 PID 进程标识符,用于跟踪从进程启动到进程结束。
2) 当启动新进程的时候,内核也给它们分配系统资源,如 CPU时间和RAM空间 。
3) 永远不向父进程返回输出的进程叫做 僵进程 。
4) 由父进程派生出来的进程叫做 子进程 。
5) 父进程 是一个派生另一个进程的进程。
6) 运行用于提供服务的Linux系统进程是 守护进程 。
7) 如果父进程在子进程之前结束,它创建了一个 孤儿进程 。
步骤4:回顾ps命令和信息。
ps命令用于列出当前系统中运行的进程。
如果一个进程耗时太长,或者看上去好像已经终止了,表现为一个终端窗口不再响应或挂起,通常需要使用ps查看系统中的进程。通过列出进程,可以查看初始化进程的命令或程序的名字,以及所有它派生出来的子进程。通过多次执行ps命令,查看进程的时间——进程占用的CPU时间,可以检查一个进程是否还在运行。如果时间小再增长,那么进程可能已经终止了。如果进程占用太长的时间或者已经停止,可以使用ps命令检查进程的进程ID (PID) ,然后杀死进程。
ps命令的输出将显示PID号和与其相关的命令或程序。PID号通常用于终止一个进程。ps命令 ( ps [-options] ) 的3个主要选项如下表所示。
表3-5 ps命令选项
| ps选项 | 意义 | 功能 |
| Ps | 无选项 | 显示当前shell或终端窗口中,当前用户的进程信息 |
| ps –e | 每一个 | 显示系统中每一个进程的信息 |
| ps –f | 完全 | 产生一个完全列表,给出每个进程的所有可用信息 |
| ps -u userid | 用户 | 显示特定用户的所有进程 |
基本的ps命令显示在当前shell中的进程信息,用户只能够查看在这个终端窗口中初始化的进程。输入ps命令,将结果填入表3-6中。
表3-6 实验记录
| PID | TTY | TIME | CMD |
| 44 | pts/0 | 00:00:00 | bash |
| 4949 | pts/0 | 00:00:00 | ps |
从当前终端窗口中,练习使用给出的每个选项的ps命令。
输入 ps -f 命令,显示运行在系统中的某个进程的完全信息,填入表3-7中。
表3-7 实验记录
| UID | PID | PPID | C | STIME | TTY | TIME | CMD |
| student | 44 | 42 | 0 | 08:09 | pts/0 | 00:00:00 | bash |
| student | 4957 | 44 | 0 | 08:31 | pts/0 | 00:00:00 | ps -f |
表3-8 ps -f栏标题
| 值 | 描述 |
| UID | 初始化进程的用户ID |
| PID | 进程的进程标识号。PID可以用来杀死进程 |
| PPID | 进程的父进程标识号 |
| C | 进程的优先级 |
| STIME | 进程的启动时间 |
| TTY | 控制进程终端的终端举型 |
| TIME | 进程使用的CPU时间的数量 |
| CMD | 命令名守护进程 (执行的程序的名字) |
步骤5:列出系统中运行的所有进程。
输入 ps -ef 命令,显示运行在系统中的各个进程的完全信息。执行该命令,并与ps –f命令的输出结果对照,一致吗?有何不同?
不一致; ps –ef显示的信息内容要多于ps -f
注意分析当前终端窗口中的输出结果:
a.显示了多少个进程?
62个
b. 进程ID的PID是什么?
进程的进程标示号
c. 启动进程的命令 (CMD) 是什么?
sched
d. 请观察,什么命令的PID号是1?
init
e. 再次运行ps –ef命令,计算进程的数目:
62个
然后执行下列命令把输出结果输入到wc命令中:
man ps|wc
第一个数字显示的是行的数目,也是进程的数目:
577
执行 man ps命令,可以打开Linux用户命令手册,了解ps命令的用法,输入wq命令可退出用户手册的阅读。man命令可以执行吗?结果如何?
可以执行;打开了Linux用户命令手册
步骤6:根据命令名搜索特定的进程。
为了终止一个进程,必须找到该进程的PID。大多数运行的系统中,有上百个进程在运行,ps -ef的列表可能很长。如果知道启动进程的执行程序的名字,可以更快地找到PID。
通过把ps命令的输出结果输入到grep中,可以搜索想要终止的特定进程,确定正确的PID。
grep命令可以在其他命令的输出中搜索所有类型的特征字符串。-l (长的输出) 选项将显示和找到的PID相关的进程的名字;-e选项显示PID和初始化命令的名字。
a. 单击红帽子,在“GNOME帮助”菜单中单击“游戏”-“堆麻将”命令,打开“堆麻将”游戏。
b. 在当前的终端窗口中,执行命令:
ps –e | grep mahjongg
(“堆麻将”游戏的进程名是“mahjongg”) ,查找和“堆麻将”游戏调度守护进程相关的所有进程。
c. 显示了多少个相关进程?
2个
d. 显示进程中最小的进程ID号是多少?
198
c. 在当前终端窗口中执行命令:
pgrep –l mahjongg
查找所有和“堆麻将”游戏调度守护进程相关的进程。ps和pgrep命令输出之间有什么不同?
ps命令显示PID、TTY、TIME、CMD ;pgrep命令只显示PID和CMD .
步骤7:确定一个要终止的进程。
当试图终止一个程序,或者释放一个挂起的终端窗口的时候,杀死和不响应的应用相关的PID可能还是不够的,一般需要杀死那个进程的父进程,在少数情况下,甚至要杀死父进程的父进程。为了沿着层次结构,从子进程追溯到派生它们的父进程,必须能够查找PID和PPID。
必须首先确定最低级不响应进程的PID。通常,可以试着去杀死那个进程。如果这样做不能够停止那个进程,可能需要杀死它的父进程。杀死父进程将杀死所有它派生的子进程。杀死一个父进程也比杀死几个子进程快得多。
1) 在GNOME当前终端窗口中,输入ps命令。
有多少进程正在运行?为什么只有这么少的进程?
有2个进程;因为ps只显示当前运行的进程 。
2) 正在运行的进程的名字是什么?它表示什么?
bash和ps
3) 这个进程的PID是多少?
4990和19683
4) 在bash shell中输入命令csh,打开一个C shell会话,当前系统的会话提示符是什么?
[student@inux~]$
5) 输入 ps -f 命令,显示在当前shell中运行的进程的所有信息。现在什么进程正在运行?
bash、-sh、ps –f
6) bash的PID是-sh (csh) 的PPID吗?
是,都为4990
7) 输入命令sleep l000&,创建一个进程,把执行挂起1000秒 (大约15分钟) 。&表示在后台运行命令,返回shell提示符,这样您可以继续工作。
8) 再次输入ps -f命令。-sh (csh) 的PID是sleep命令的PPID吗?哪个PID是csh (C shell) 的子进程?
是,都为19695;19717和19718是csh的子进程
9) 输入命令 kill -9 init进程的PID: 1 是sleep父命令的PPID sleep进程现在是什么类型的进程? 孤儿进程 步骤8:使用kill命令终止一个进程。 信号用于终止、挂起和继续进程。有时候使用Ctrl + c可以终止一个不响应的进程。这样向进程发送一个中断 (INT) 信号,终止它及所有它派生的子进程。 kill命令提供了一个终止不想要的命令进程的直接方法。当想停止一个运行了很长时间的命令的时候,或者当需要终止一个不能够正常退出的进程的时候,它很有用。指定PID正常地杀死一个进程。 kill [-signal] process -id 为了使用kill命令终止一个进程,应该首先键入ps找出进程的PID,然后键入kill紧跟着PID。如果使用kill而没有指定信号,则信号15 (SIGTERM) 将被发送给特定PID号的进程。这叫做软杀死,通常终止了进程。如果可能,最好软杀死进程,这样它可以正确地关闭文件,温和地终止进程。 如果需要强制终止一个进程,可以使用带 -9选项的kill命令。这个选项叫做强制杀死,当shell对所有其他终止信号都不响应的时候,需要使用它来杀死shell。 kill -9 process -id 注意:对于shell之外的进程,把kill –9 (SIGKILL) 作为最后的选项,因为它是一种生硬的方法,不允许正确的进程终止。 a. 输入命令ps –f ,显示在当前shell中运行的进程的完整信息。现在什么进程正在运行? bash、sleep 1000、ps -f b.因为sleep进程现在是一个孤儿进程,已经被init进程 (PID #l) 收养,输入命令,对sleep的PID执行软杀死。如果sleep已经终止 (超过15分钟) ,则重复步骤7中的8) 、9) 操作,然后软杀死sleep程序。再次输入ps –f命令,正在运行什么程序? bash、ps -f 步骤9:按照用户查找和终止一个进程。 ps命令可以带 -u (用户) 选项使用,查找指定用户的进程。这个命令比ps-ef使用得更多,因为一般只能够管理属于自己的进程。我们可以通过用户登录名或者UID号来查找用户的进程。用户只能够终止自己的进程,但是超级用户可以终止系统中所有运行的进程。 ps –u login-ID或UID 1) 启动计算器和“堆麻将”游戏GNOME应用程序。 2) 使用带 -u选项的ps命令,查找以登录ID (例如,userX) 或者数字UID (例如,1004) 运行的所有进程。计算器应用程序的PID是什么? 19832 3) 使用软杀死终止计算器应用程序,“堆麻将”是否仍然在桌面上运行? 仍在桌面上运行 4) 使用ps -u命令组合grep,查找“堆麻将”程序的PID号,而不是使用ps -u查找整个列表。您使用什么命令? 提示:猜猜“堆麻将”程序的命令名中可能有哪个字母,使用grep搜索那些字母。 ps –u student| grep mahj 5) 终止“堆麻将”程序。它是否还在桌面上运行? 否 6) 退出 C shell。 步骤10:删除所有在本实验中创建的文件和目录。 步骤11:关闭终端窗口,注销。 5.2 Linux文件信息命令和基本文件管理 (实验估计时间:120分钟) 背景知识 实验目的 工具/准备工作 实验内容与步骤 背景知识 在本实验中,我们将使用不同的信息命令,来调查和发现文件的信息;使用命令来帮助确定文件类型和创建文件的应用;也可以使用几个命令来查看文本文件的内容和对它们进行比较。 作为基础,使用命令来分析和管理文件及目录的能力对于进一步学习Linux操作系统是非常重要的。Linux用户和系统管理员必须有使用命令行的工作背景,例如创建可执行的脚本文件等 (Linux脚本文件包含着一系列的Linux命令) 。许多操作系统管理和设备配置作业需要理解Linux命令,并且在某些情况下,命令行是仅有的操作方式。 在本实验中,我们将在命令行下使用文件管理命令工作,介绍文件和目录命名规则。我们将创建一个简单的目录结构,然后在那些目录中创建一个文件,并练习创建和删除文件和目录。 实验目的 通过本实验: 1) 使用控制字符执行特殊功能; 2) 使用file和strings命令确定文件类型; 3) 使用cat利more命令显示文本文件的内容; 4) 使用head和tail命令显示文本文件的部分内容; 5) 使用wc命令确定单词、行和字符数; 6) 使用diff命令比较2个文件。 7) 回顾文件和目录命名约定; 8) 使用touch命令创建新文件; 9) 使用mkdir命令创建新目录; 10) 使用rm命令删除文件; 11) 使用rm -r命令删除目录。 工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。 您需要做以下准备: 1) 由指导老师分配的登录用户帐号 (如user2) 和口令。 2) 一台运行Linux操作系统的计算机。 实验内容与步骤 1. 文件信息命令 2. 基本的命令行文件管理 1. 文件信息命令 步骤1:开机,登录进入GNOME。 在GNOME登录框中填写指导老师分配的用户名和口令并登录。 步骤2:访问命令行。 单击红帽子,在“GNOME帮助”菜单中单击“系统工具”-“终端”命令,打开终端窗口。 步骤3:使用控制字符执行特殊功能。 控制字符用来执行特殊的作业,如中止和启动屏幕输出。 大多数PC键盘有两个控制键。它们通常标记为Ctr1,可以在键盘的左右下角找到。为了输入一个控制字符序列,可按住Ctrl键不放,然后按下键盘上相应的字符。 Ctrl + C:中断当前活动。当你在csh中键入一个不可识别的命令行 (例如,$ls “) ,收到第2个提示符的时候,Ctrl + C也可以用于恢复shell提示符。 Ctrl + Z:终止当前活动。显示ls命令的手册页面 (man ls) ,然后使用Ctrl -z中止输出。 当你接下Ctrl + Z的时候,发生了什么事情? 退出了ls命令的手册界面 Ctrl + D:表示文件的末尾或者退出。 Ctrl + D用于退出一些Linux工具程序 (bc、write等) ,退出一个终端窗口,注销一个终端会话或者命令行登录会话。作为一个一般的规则,当您出现“死机”时,或者如果Ctrl + C不起作用,可试试Ctrl + D。例如: 1) 在shell提示符下键入bc,启动基本的计算器工具程序。 2) 把两个数字相乘 (键入:458*594,然后按回车键) 。 3) 按Ctrl + D退出计算器。 当使用计算器的时候,你的提示符是什么? This is free software with ABSOLUTELY NO WARRANTY. For details type ‘warranty’. Ctrl + U :擦除整个命令行。Ctrl + U最常用在: · 一个擦除决定不执行的命令行的快捷方式。 · 如果登录到一个远程系统,退格键不起作用。 · 它可以确保在登录的时候,从一个“空”的用户帐号和口令输入开始。 · 因为在口令输入的时候看不见它们,当知道自己键入了错误字符的时候,使用Ctrl + U擦除密码,重新开始输入。 如果输入一个命令,如ls –R/,有时候,会在按下回车键之前想擦除命令行。输入一个命令,在接下回车键执行命令之前按下Ctrl + U。结果是什么? 删除了刚才输入的命令 步骤4:使用file命令确定文件类型。 在Linux系统中可以找到许多类型的文件。文件类型可以通过使用file命令来确定。当一个用户试图打开或阅读一个文件的时候,这个信息很重要。确定文件类型可以帮助一个用户决定使用哪个程序或命令来打开这个文件。这个命令的输出最常见的是如下几种:文本文件、可执行文件或数据文件。 1) 文本文件:包括ASCII或英语文本、命令文本和可执行的shell脚本。这种类型的文件可以使用cat或more命令读取,可以使用vi或其他文本编辑器编辑。 单击红帽子,在“GNOME帮助”菜单中单击“辅助设施”-“Text Editor”命令,在文本编辑中键入适当内容并保存为test文件。 使用file命令来确定test文件的文件类型。它是哪种类型的文件? ASCII text 2) 可执行 (或二进制) 文件:包括32位的可执行文件和可扩展链接格式(ELF) 编码文件,和其他动态链接的可执行文件。这种文件类型表示这个文件是一个命令或程序。 单击红帽子,在“GNOME帮助”菜单中单击“办公”-“OpenOffice.org Writer”命令,建立一个文档如ww.sxw。 使用file命令确定你所建立的文件类型。它是哪种类型的文件?(注意文件名部分必须包括扩展名,如file ww.sxw 。) Zip archive data, at least v2.0 to extract 可执行的文件 3) 数据文件:数据文件是由系统中运行的应用创建的。在某些情况下,文件的类型是会说明的。例如,FrameMaker (桌面印刷软件) 文档。 使用file命令确定dir1/coffees子目录中beans文件的文件类型。它是什么文件类型的? 本机没有dir1/coffees目录。但有beans文件夹,是一个目录文件。 步骤5:使用strings命令。 strings命令可以用于打印可执行文件或者二进制文件中的可读字符。 一些有编程背景的人,可以解释strings产生的输出。这个命令在这里只是作为一个展示可执行文件中可打印字符的方法来介绍。strings命令必须用于读取可执行文件,如 /usr/bin/cat。在大多数情况下,strings命令也可以给出命令的使用语法。 使用strings命令查看 /usr/bin/cal文件的可读字符。列出strings命令中的一些输出。 /lib/ld-linux.so.2 libc.so.6 putchar strerror puts wcstombs 步骤6:使用cat命令显示文件的内容。 cat命令在屏幕上显示一个文本文件的内容。它常用于显示如脚本文件 (类似批处理文件) 这样的短文本文件。如果文件超过一屏的话,必须使用一个屏幕可以滚动的窗口,如GNOME环境中的终端窗口。 键入 ls /dev > dev1 使用cat命令显示主目录中dev1文件的内容。文本的显示出现了什么情况? 显示了一段很长的文本内容 步骤7:使用more命令显示文件的内容。 more命令是一个用于显示文本文件首选的方法,因为它会自动的一次显示一屏文件内容。如果文件的信息比一屏更长,屏幕的底部显示如下的信息:--More-- (n%) (文件的n%已经显示) 。按下回车键,继续一次显示一行信息。空格键将继续一次显示一屏内容。 使用more命令显示主目录中dev1文件的内容。文本的显示出现了什么情况? 显示出一屏的文本内容。 按回车键,继续显示一行信息;按空格键,继续显示一屏内容 步骤8:使用head命令显示文件的一部分。 head命令用于显示一个或多个文本文件的前n行。在默认情况下,如果没有给出 -n选项,将显示前10行。当您只想查看文件的开始的几行,而不管文件的大小的时候,head命令是很有用的。 1) 单独使用head命令,显示主目录中dev1文件的开始部分。显示了多少行? 10行 2) 使用带 -n选项的head命令,显示主目录中dante文件的前20行。您输入什么命令? head -20 dante 步骤9:使用tail命令显示文件的一部分。 使用tail命令,显示文件的最后几行。在默认情况下,如果没有指定 -n选项,将显示最后10行。当检查大型日志文件最近输入内容的时候,tail命令是很有用的。备份工具程序常把备份哪个文件和什么时候做的备份,写到日志文件中去。一个备份日志文件中最后的输入通常是备份文件的总数和备份是否成功完成的信息。-n选项显示了文件的最后n行。 单独使用tail命令,显示主目录中dante文件的末端。显示了多少行? 10行 步骤10:通过使用wc命令,确定行数、单词数和字符数。 wc (单词计数) 命令可以用于显示文本文件的行数、单词数、字节数或者字符数。当确定文件特征或者当比较两个文件的时候,这个命令是很有用的。使用不带选项的wc将给出文件的行数、字节数。使用带一个选项的wc,可以确定想查看的哪一项内容。 使用wc命令确定主目录中dev1文件的行数、单词数和字符数。有多少行、多少个单词和多少个字符? 7520行 7520个单词 47288个字符 步骤11:使用wc计算目录条目的数目。 使用wc和ls命令确定主目录中条目 (文件和目录) 的数目。为此,必须把ls命令的输出导入到wc命令中。 更多符号是竖线,和后斜线 (\\) 在同一个键上。在命令行提示行下,输入命令ls| wc -w。有多少个文件和目录名 (单词) ? 28个 步骤12:使用diff命令确定文件之间的不同之处。 diff (不同) 命令用于比较2个文本文件,找出在它们之间的不同之处。wc命令可以比较文件,因为它计算行数、单词数和字符数。有可能2个文件有相同的行数、单词数和字符数,但是字符和单词不同。diff命令可以从实际上找出文件之间的不同。 这个命令的输出把2个文本文件之间的不同一行一行的显示出来。diff命令有2个选项:-i 和 -c。-i选项忽略字母的大小写,例如A和a相等。-c选项执行细致的比较。 单击红帽子,在“GNOME帮助”菜单中单击“辅助设施”-“Text Editor”命令,创建两个文件fruit1和fruit2,并键入适当内容。 使用diff命令执行细节比较,确定fruit1文件和fruit2文件之间的区别。 在fruit1文件和在fruit2文件中,哪几行是不同的? diff –c fruit1 fruit2 会把两文件的内容列出来,然后可以比较不同 1) cat命令: · 对fruit1文件使用cat命令。 · 对fruit2文件使用cat命令。 · 键入命令行cat fruit1 fruit2 > filex。 · 对filex文件使用cat命令。上面的命令行做了什么工作? 把fruit1和fruit2两个文本的内容合并到一起,然后写入filex文本中。 2) 可以使用哪2个命令来确定2个文件是否相同? diff –c fruit1 fruit2 cat fruit1 ; cat fruit2 步骤13:关闭终端窗口,注销。 2. 基本的命令行文件管理 步骤14:回顾Linux的文件和目录命名规则。 在本实验中,我们将创建文件和目录,因此,在开始之前,先来回顾一下Linux文件和目录的命名规则和指导方针。 1) 最大长度:组成文件和目录名最大长度为255个数字字母字符。一般来说,应该尽可能的保持文件名短但是仍然有意义。 2) 非数字字母字符:一些非数字字母字符或者元字符是可用的:下划线 (_) 、连字符号 (-) 和句点 (.) 。这些元字符可以在文件或目录名中使用多次(Feb.Reports.Sales是一个有效的文件或目录名) 。尽管shell允许把星号 (*) 、问号(?) 和发音符号 (~) 、方话号 ([ ]) 、&、管道 [ | ] 、引号 (“”) 和美元符号 ($) 在文件名中使用,但这不是推荐的,因为这些字符对于shell有特殊的意义。分号 (;) 、小于号 (<) 和大于号 (>) 是不允许作为文件名的。 3) 文件名扩展:文件名可以包含一个或多个扩展名。扩展名常被一个应用追加到文件的末端。扩展名通常是1个到3个字符,追加到文件名的末端,之前有一个句点 (.) 。当命名文件的时候,您可以选择使用这个规则。 4) 目录名的扩展名:目录名一般不包含扩展名,但是也没有规则反对这一点。 5) 大小写敏感:Linux文件和目录名是大小写敏感的。Project1和projectl不是同一个文件。在一个目录中,不能够有两个文件有着同样的名字。一般规则都是使用小写字母。 检查表7-1中的文件名,指出它们是否是有效或者推荐的Linux文件或目录名,为什么是或为什么不是。 表7-1 实验记录 步骤15:使用touch命令创建文件。 每次创建一个新的字处理文档或者电子数据表,就是正在创建一个新文件,应该符合之前提到的文件命名规则。也必须拥有创建文件的目录的足够权限。 使用touch命令,可以同时创建一个或多个文件。一些应用要求在写文件之前,文件必须存在。touch命令对于快速创建需要处理的文件很有用。也可以使用touch命令更新文件被访问的时间和日期,使文件可以再次被备份。当创建文件或目录的时候,可以指定绝对和相对的路径名。 命令格式: touch filename (s) 1) 在主目录中使用touch命令创建一个名为newfile的文件,应该使用什么命令? touch newfile 2) 使用touch命令在这个目录中创建另一个叫做filenew的新文件,应该使用什么命令? touch filenew 3) 输入命令显示practice目录中的文件的长列表。创建的文件列出来了吗? 列出来了 4) 谁是文件的所有者? root 5) 和文件关连的组是什么? root 6) 创建的日期和时间是什么? 12月15日 10:25 7) 文件的大小是多少? 0 8) 使用file命令确定newfile的文件类型。它是哪一类的文件? empty 9) 使用touch命令同时创建3个文件:new1、new2和new3,应该使用什么命令? touch new1 new2 new3 10) 输入命令显示practice目录中文件的长列表。创建的3个新文件列出来了吗? 列出来了 步骤16:使用mkdir命令创建新目录。 mkdir (创建目录) 命令用于创建目录或文件夹。目录可以包含其他目录,称为子目录,它们可以包含文件。 目录可以使用或者绝对路径名或者相对路径名创建。可以在同一行中指定多个目录名,创建多个新目录。必须有创建目录的足够权限。 mkdir directory_name (s) 1) 从主目录中,使用相对路径名改变到practice目录中。使用什么命令? cd /practice 2) 使用mkdir命令,在这个目录中创建一个叫做newdir的子目录。使用什么命令? mkdir /newdir 3) 输入命令,显示practice目录中文件和目录的长列表。创建的目录列出来了吗? 列出来了 4) 目录的所有者是? root 5) 文件的大小是多少? 4096 6) 使用file命令确定newdir文件的类型。它是哪一类的文件? 目录文件 7) 如果名字中没有字符dir,采取别的什么方法来识别出它是一个目录? 用file dir 命令,可确定是一个目录 8) mkdir命令创建3个目录,目录名分别为high、medium和low,应该使用什么命令? mkdir /high mkdir /medium mkdir /low 9) 用ls命令检查创建是否成功? 成功了 步骤17:使用rm命令删除文件。 rm目录可以删除单个文件或多个文件。可以通过在rm命令之后指定文件的名字,或者使用星号 (*) 和问号 (?) 元字符,同时删除几个文件。在Linux系统中删除的文件是永远被删除了,除非使用图形界面删除文件,它们才能够被恢复。rm命令可以带 –i (交互) 选项使用,它在删除文件之前会提示用户。使用rm -i命令作为防范,避免误删文件: rm [-i] filename (s) 1) 使用rm命令删除早先在practice目录中创建的newfile文件,应该使用什么命令? rm –r practice/newfile 2) 输入命令显示practice目录中文件的长列表。创建的文件还在吗? 不在了 3) 使用带 -i选项的rm命令,删除早先在practice目录中创建的filenew文件。交互式选项起到什么作用? 在删除之前提示用户,避免误删 4) 删除早先创建的三个名为new1、new2和new3的文件。使用问号 (?) 通配符使用一个命令删除所有三个文件。使用什么命令? rm new? 5) 输入命令,显示practice目录中文件的长列表。三个文件还在吗? 不在了 6) 还有其他的什么方法来删除new1、new2和new3文件? rm new[1-3] 步骤18:使用rm -r命令删除目录。 rm -r目录用于删除目录。它将删除从目标目录开始的目录,包括所有的子目录和文件。当rm命令带 -r信息使用的时候,它可以删除单个目录 (空或不空) 或目录树的整节。rm命令可以带 -i选项使用,它在删除目录之前会提醒用户: rm –r [i] directory_name (s) 1) 删除早先创建的newdir子目录,使用什么命令? rm –ri directory/newdir 2) 输入命令显示practice目录中文件的长列表,创建的子目录还在吗? 不在了 3) 改变到早先创建的mediurn子目录中,输入什么命令? cd /pratice/medium 4) 删除早先创建的low子目录,使用什么命令? rm –ri practice/low 5) 用相对路径名和快捷方式,改变回到practice子目录中,应使用什么命令? cd .. 6) 使用一个命令删除high和medium子目录,应使用什么命令? rm –ri high medium 步骤19:练习所学习到的内容。 通过在practice目录中创建一个三级的目录树,练习使用touch、mkdir和rm命令。试着使用有意义的目录名。记住可以使用一个命令创建整个目录结构。在每个目录中创建多个文件。记住可以使用一个命令创建多个文件。 结束的时候,请删除实验时创建的文件和目录。 步骤20:关闭终端窗口,注销。下载本文
文件名 是否为Linux文件或目录名 为什么是或为什么不是 12345abcde678 是 没有超过256个字符 Hobbies: 2 不是 “ ”不可以在文件名或目录名中使用 Adcd-123 是 “-”可以在文件名或目录名中使用 Sales*repts*2001 不是 “*”不可以在文件名或目录名中使用 D.projects.bj.2001 是 “-”可以在文件名或目录名中使用 Projects>1.bj-2001 不是 “〉”不可以在文件名或目录名中使用