Red Hat Linux
—实验简易教程(1.1测试版)
基础软件解决方案团队出品
前言
- 1 -
目录
第一章 红帽Linux系统安装与简单配置
第一节 准备工作…………………………………………………4 第二节 安装Red Hat Linux9…………………………………….4
第二章 Linux 常用命令用法
第一节 实验目的…………………………………………………19 第二节 实验内容…………………………………………………19 第三节 主要操作步骤……………………………………………19
第三章 vi 编辑器使用
第一节 实验目的…………………………………………………23 第二节 实验内容…………………………………………………23 第三节 主要操作步骤……………………………………………23
第四章
第一节 实验目的…………………………………………………25 第二节 实验内容…………………………………………………25 第三节 主要操作步骤……………………………………………25
第五章 第一节 实验目的…………………………………………………30 第二节 实验内容…………………………………………………30 第三节 主要操作步骤……………………………………………30
- 2 -
第六章
第一节 实验目的…………………………………………………34 第二节 实验内容…………………………………………………34 第三节 主要操作步骤……………………………………………34
第七章
第一节 实验目的…………………………………………………40 第二节 实验内容…………………………………………………40 第三节 主要操作步骤……………………………………………40
- 3 -
第一章 红帽Linux系统安装与简单配置
RedHat Linux是目前世界上使用最多的Linux操作系统。因为它具备最好的图形界面,无论是安装、配置还是使用都十分方便,而且运行稳定,因此不论是新手还是老玩家都对它有很高的评价。本学期所用RedHat Linux9.0版本在原有基础上又有了很大的进步。它完善了图形界面,增强了硬件的兼容性,安装起来更加得心应手,尤其增强了多媒体方面的能力—使你能够在Linux下播放多媒体文件。它还采用了OpenSSL 128位加密技术,使你的网络通信更加安全;最新的内核;提供了USB借口的鼠标和键盘的支持;提供了更加容易管理和配置的图形桌面以及图形界面的内核调整和防火墙配置工具。总之,不论你是一个新手还是一个Linux老玩家,不论你是个人使用还是企业用服务器,RedHat Linux9.0都是你最好的选择。
在网络病毒漫行的今天,大家都对Linux越来越倾慕,还是就是学嵌入式开发的是经常用到这个系统的,但是很多人在应用区、水区谈到都不会安装这个所谓的超级安全的系统,还是就是因为安装过程中出现的这样那样的问题,所以针对这样一个情况,我就整理了一下并简单的向大家介绍一下Linux的安装吧。
一、 准备工作
1、购买或下载RedHat9的安装光盘(3CD)或镜像文件。
2、在硬盘中至少留2个分区给安装系统用,挂载点所用分区推荐4G以上,交换分区不用太大在250M左右比较合适,文件系统格式不论,因为安装过程会重新格式化。
3、记录下你电脑中下列设备型号:鼠标、键盘、显卡、网卡、显示器,及网络设置用到的IP地址、子网掩码、默认网关和DNS名称服务器地址等信息。
二、 安装RedHat Linux9 第1步:选择安装方式 (1)、图形安装(直接回车) (2)、文本安装(输入 linux text)
- 4 -
第2步:选择“OK”为检查光盘 选择“Skip\跳过检查。我确认我的光盘是好的,我跳过!
第3步:这一段是费话,跳过!
- 5 -
第4步:我选择简体中文,因为我是中国人,前二天我还参加上海的抗日大游行呢!不过选择韩语也无所谓,因为我也懂一点点韩语!
第5步:这一步,是让你选择你的键盘,我用到现在的键盘,除了US的,我还没用过其它的呢!下一步!
- 6 -
第6步:让你选择鼠标。就算你不知道你是什么类型的鼠标也无所谓,因为我们以后都是用字符操作,有没有鼠标也无所谓!
选择安装类型,这里我们选择“服务器”其实只要你懂,你选择哪种类型都无所谓!
- 7 -
第7步:因为大家是跟着我做,所以不要担心你懂不懂!我们选择“手工分区”!
第8步:如果你的硬盘只有一个分区,你就会看到如下界面,如不是,你可以点删除它们!下面我们点“新建”!
- 8 -
第9步:点“新建”让你添加一个分区!我们首先添加一个,/boot分区(想当于windows下的引导分区)类型为ext3(相当于FAT32、NTFS)大小为100 ,模仿我的图就对了!
第10步:再点“新建”我们建一个swap文件系统(内存交换区)在“文件系统类型”那一栏选择 “swap” 大小:你的内存 512*2=1024,设这里要注意一下!大小要设成你内存大小的双倍,但要考虑到以后你要加内存,我们就设高一点,如果你以后内存的极限为2G*2=4096,那么我们就提前设成4096!不过linux是低配置,高性能的操作系统哦!
- 9 -
第11步:下面再建一个 “/” linux下的根分区 这里设成“1000”吧!
第12步:上面新建的几个分区为linux必须的分区,下面我们就把剩下的硬盘分区,分成一个分区! 这里要注意的是:/mnt/linux 这个路经,是你的分区路经(相当于你的E盘一样),选择全部可用空间!
- 10 -
第13步:上面所作的步骤,建好了所有的分区。 如果你照着我的话,应该是如下图一样!点击下一步。
第14步:这一步,没必要明白!
- 11 -
第15步:网络配置,点编辑
第16步:取消“使用DHCP进行配置”其它的按照说明填写!
- 12 -
第17步:如图!只做为参考!
第18步:这里我们选择“无防火墙”!如果你以后要设“防火墙”你可以手动写规则,我就是这么做的!
- 13 -
第19步:下一步。
第20步:下一步。
第21步:这里设定“root”超级用户的密码
- 14 -
第22步:如果你只想做电影服务器和FTP服务器!你把所有的“√“都去掉,只留下“FTP服务器”和“开发工具”前面的“√”。 我们只安装“FTP服务器”(用来传电影)和“开发工具”(开发包,是linux下经常用到的!)
第23步:下一步
- 15 -
第24步:等待中。。。。。。
第25步:换第二张盘!
第26步:换第三张盘!
- 16 -
第27步:随便你选不选择!
第28步:完成安装了!
第29步:linux的启动界面
- 17 -
第30步:启动完成,等待用户的登陆!
第31步:Ligin: root Password:你的超级用户密码
到这里linux的安装已经全部完成了,赶快去遨游的linux的世界吧!
- 18 -
第二章 Linux 常用命令用法
一、 实验目的
1. 2. 3. 4.
掌握Linux 一般命令格式。
掌握有关文件和目录操作的常用命令。 掌握有关进程操作的常用命令。 熟练使用man 命令。
二、 实验内容
1. 正确地登录和退出系统。
2. 熟悉date, cal, who, echo, clear, passwd 命令。
3. 在用户主目录下对文件进行操作:复制一个文件、显示文件内容、查找指定内容、
排序、文件比较、文件删除等。
4. 对目录进行管理:创建和删除子目录、改变和显示工作目录、列出和更改文件权限、
链接文件等。
5. 利用man 显示 date, echo 等命令的手册页。 6. 显示系统中的进程信息。
三、 主要实验步骤
1. 登录进入系统,修改个人密码。
示例:登录进入系统应该先输入用户名如:yucheng ,然后输入密码******(若干位)。 $ passwd
Changing password for user yucheng. [用户名是 yucheng ] Changing password for yucheng (current) UNIX Password: [提示输入老密码] New password: [要求输入新密码]
Retype new password: [重新输入一遍新密码。如果两次输入的密码
完全一样,系统就接收这个密码作为下次登录时的密码]
Passwd:all authentication tokens updated successfully. !!!注意事项:
a, 系统出于安全考虑,输入的所有密码都不在屏幕上显示。
b, 如果输入的密码不对,系统会发出提示,要求重复以上步骤。
2. 使用简单命令:date, cal, who, echo, clear 等,了解Linux 命令格式。
示例:date 命令用于在屏幕上显示或设置系统的日期和时间。如果没有选项和参数,
将直接显示当前的日期和时间。
cal 命令可以显示公元1~9999年中的任意一年或者一个月的日历。 who 命令将列出所有正在使用的系统的用户、所用终端名和注册到系统的时间。 echo 命令可以将命令行中的参数显示到标准输出(即屏幕)上。
clear 命令清除屏幕上的信息,它类似与DOS 中的 CLS 命令。清屏后,提示
符移到屏幕的左上方。
- 19 -
命令的演示如下所示:
3. 浏览文件系统:
(1)、运行pwd 命令, 确认当前工作目录。
示例:pwd 命令可以在屏幕上显示出当前工作目录的绝对路径,例如: $pwd
/home/yucheng (2)、运行 ls –l 命令, 理解各字段的含义。 示例:ls 命令列出指定目录的内容。
-l 以长格式显示文件的详细信息。输出的信息分成多列,它们依次是:
文件类型与权限 链接数 文件主 文件组 文件大小 建立或最近修改的时间 文件名 例如:-rw-r- -r- - 1 yucheng yucheng 0 3 月 21 00:43\\ (3)、运行 ls –ai 命令, 理解各字段的含义。 示例:-a 显示指定目录下所有子目录和文件,包括以“ . ”开头的隐藏文件(.emacs)。 -i 在输出的第一列显示文件的I 节点号。 例如:308763 .emacs (4)、使用cd 命令, 将工作目录改到根(/)上。 示例:cd 命令用来改变工作目录。
例如:$cd [将当前目录改到用户的主目录] $cd .. [将当前目录向上移动一级] $cd ../.. [将当前目录向上移动两级] $cd /bin/chmod [将当前目录改到/bin/chmod] (5)、用 mkdir 建立一个子目录 subdir 。 示例:$mkdir subdir (6)、将工作目录改到subdir 。
示例:$cd subdir [将当前目录改到subdir目录下] $pwd [用 pwd 验证结果如下所示:] /home/yucheng/subdir
4. 文件操作:
(1)、验证当前工作目录在 subdir 。
- 20 -
示例:$pwd [用 pwd 验证结果如下所示:] /home/yucheng/subdir (2)、运行 date>file1 ,然后运行 cat file1 ,看到什么信息? 示例:$date>file1 [将date 输出的内容定向到文件file1 中] $cat file1 [显示 date定向到文件file1 中的内容 如下所示:] 一 3 月 28 21:28:42 CST 2011 (3)、运行 cat subdir ,会有什么结果?为什么?
示例:$ cat subdir [显示结果如下所示:] cat : subdir 没有那个文件或目录
原因:cat 命令用于显示文件的内容,而subdir是一个目录 (4)、利用 man 命令显示 date 命令的使用说明。
示例:$man date [将date 命令的使用说明显示在屏幕上 ] (5)、运行 man date>>file1 ,看到什么? 运行 cat file1 ,看到什么?
示例:$ man date>>file1 [将date 命令的使用说明定向到文件file1 中] $ cat file1 [将date 命令的使用说明定向到文件file1 中的内
显示在屏幕上]
(6)、利用 ls –l file1, 了解链接计数是多少? 运行 ln file1 ../fa ,再运行 ls –l file1 ,看链接计数有无变化?用 cat 命令显示fa 文
件内容。
示例:$ ls –l file1 [以长格式显示file1文件的详细信息 如下所示:] -rw-r- -r- - 1 yucheng yucheng 5402 3 月 21 21:42 file1
运行后可看到:链接计数为1 $ ln file1 ../fa $ ls –l file1
-rw-r- -r- - 2 yucheng yucheng 5402 3 月 21 21:42 file1 运行后可看到:链接计数为2
$cd .. [默认链接文件建立在上一级目录中即yucheng 目录中 所
以要先回到上一级目录才能用cat 来显示文件fa 的内容]
$cat fa [将文件fa 中的date 命令的使用说明内容显示在屏幕上]
(7)、显示 file1 的前10 行,后10 行。
示例:$head -10 file1 [在屏幕上显示 file1 的前10 行] $tail 10 file1 [在屏幕上显示 file1 的后10 行] (8)、运行 cp file1 file2 ,然后运行 ls –l , 看到什么? 运行 mv file2 file3 ,然后运行 ls –l , 看到什么? 运行 cat f* ,结果怎么样?
示例:$ cp file1 file2 [将文件file1复制file2文件中] $ ls –l [在当前目录下又出现一个file2文件] $ mv file2 file3 [将文件file2重命名为file3文件] $ ls –l [在当前目录下原来的file2文件变成了file3文件] $ cat f* [将开头为f的文件中的内容显示在屏幕上] (9)、运行 rm file3 ,然后 ls –l ,结果如何?
示例:$rm file3 [删除文件file3] $ls –l [在当前目录下原来的file3文件不见了]
- 21 -
(10)、在 /etc/passwd 文件中查找适合你的注册名的行。
示例:$cd .. [回到yucheng 的上一级 即 home ] $cd .. [回到 home 的上一级 即 root ] $cd etc [转到 etc 目录下]
$cat passwd|more [将文件的内容显示在屏幕上,且每次显示一
屏,通过回车向下走一行,空格向下走一屏。]
显示结果如下(我的注册名):
yucheng:x:500:500:yuchengtianxia:/home/yucheng:/bin/bash
(11)、运行 ls –l ,理解各文件的权限是什么?
示例:$ls –l|more [显示etc 目录下的各文件, passwd 文件的
显示如下:]
-rw-r- -r- - 1 root root 1654 3 月 20 00:08 passwd
文件类型为普通文件,文件主权限是可读可写不可执行,组用户权限是可读不可写不可执行,其他用户权限是可读不可写不可执行。 (12)、用两种方法改变 file1 的权限。 示例:(1)、以符号模式改变权限。(2)、以绝对方式改变权限。
$chmod a+x myfile [将文件的权限改为所有用户都有执行权限] $chmod 111 myfile [将文件的权限改为所有用户都有执行权限] (13)、统计 file1 文件的行数、字数。 示例:$wc –lw file1 (14)、运行 man ls|more ,显示结果是什么?
示例:$ man ls|more [将ls的使用说明的内容显示在屏幕上,且每次显示
一屏,通过回车向下走一行,空格向下走一屏。]
运行 cat file1|head -20|tee file5 ,结果如何?
示例:$ cat file1|head -20|tee file5 [将file1文件的前20行显示在屏幕上,并且将
显示在屏幕上的20行数据存到文件file5中。]
运行 cat file5|wc ,结果如何? 示例:$ cat file5|wc [将文件的内容的 行数 字数 字节数]
- 22 -
第三章 vi 编辑器使用
一、 实验目的
学习使用vi 编辑器的建立、编辑、显示、及加工处理文本文件。
二、 实验内容
1. 2. 3. 4. 进入和退出vi 。
利用文本插入方式建立一个文件。 在新建的文本文件上移动光标位置。 对该文件执行删除、复原、修改、替换等操作。 三、 主要实验步骤 1. 进入和退出vi,及vi 编辑器的三种工作方式的转换。 示例: Linux shell 命令方式 插入方式 ex转义方式 命令方式 Linux shell
2. 建立一个文件,如 file.c 。进入插入方式,输入一个C 语言程序的各行内容,故意制造几处错误。最后,将该文件存盘。回到shell 状态下。 示例:$vi file.c [建立一个文件名为file.c ,并且进入命令方式] 输入的C语言代码如下所示:
- 23 -
3. 运行 gcc file.c –o myfile ,编译该文件,会发现错误提示。理解其含义。
示例:
在第六的 int 之前存在错误,因为int b之后我们故意把“ ; “给删了。这也导致在第七行引用的时候,就会发生没有定义”b“的错误。接下来就当然会在第八行表达式”c = a+b;“引用的时候”c“得不到值,发生没定义的错误。
4. 重新进入vi ,对该文件进行修改。然后存盘,退出vi 。重新编译该文件。如果编译通过了,可以用 ./myfile 运行该程序。 示例:
5. 运行man date>file10,然后 vi file10。
示例:$ man date>file10 [将date 的使用说明重定向的文件 file10 中] $ vi file10 [进入vi 编辑器的命令方式] 使用 x,dd 等命令删除某些文本行。 说明:x 命令删除光标所在的字符。 dd 命令删除光标所在的整行。 说明:使用u 命令可以复原此前的情况。 使用 c,r,s 等命令修改文本内容。
说明:c 命令修改文本对象,用新输入的文本代替老的文本。 r 命令是用随后输入的单个字符取代光标所在的字符。 s 命令是用随后输入的文本代替光标所在的字符。 使用检索命令进行给定模式的检索。
说明:进入文件的vi 编辑状态在命令方式下输入:/模式+回车键
系统就从当前行开始向前查找这个模式,找到第一个相匹配的字符串后,光标就停在该模式的第一个字符上。
- 24 -
第四章shell 编程
一、 实验目的
1. 2. 3. 4.
了解shell 的作用和主要分类。 掌握bash 的建立和执行方式。 掌握 bash 的基本语法。 学会编写 shell 脚本。
二、 实验内容
1. 2. 3. 4. 5. 6.
shell 脚本的建立和执行。 历史命令和别名定义。
shell 变量和位置参数、环境变量。 bash 的特殊字符。 一般控制结构。
算术运算及bash 函数。
三、 主要实验步骤
1. 利用vi 建立一个脚本文件,其中包括 date,cal,pwd,ls 等常用命令。然后以不同方式执行该脚本。
示例:$vi cmd.sh [进入vi 编辑器并创建文件 cmd.sh ] $cat –n cmd.sh [显示文件cmd.sh 并且编行号 如下所示]
$bash cmd.sh [执行bash 脚本文件 cmd.sh 执行结果如下所示]
其它两种方式如下所示:
$bash 2. 运行 history 命令,配置历史命令环境。 示例:$history [显示历史命令] $touch .myhistory [创建一个隐藏文件] $vi HISTFILE=”/home/yucheng/.myhistory” [历史命令将存放在次文件中] - 25 - 3. 体会bash 的命令补齐功能。 示例:$bash cm +tab键 [输入目录名或文件名的开头部分,然后按Tab键就变为如 下所示] $bash cmd.sh 4. 用 alias 定义别名,然后执行。 示例:$alias [显示别名清单] $bashcmd cmd.sh [验证bashcmd 是否已经定义] $alias bashcmd=’bash’ [定义bashcmd ] $bashcmd cmd.sh [验证bashcmd 是否已经起作用] $unalias bashcmd [取消bashcmd 别名] $bashcmd cmd.sh [验证bashcmd 是否已经取消] 5. 分析下列shell 脚本的功能: 运行如下: $bash chapter4_8.sh a b c d 结果如下: d c b a chapter4_8.sh 运行如下: $bash –x chapter4_8.sh a b c d [-x 是为了单补跟踪脚本] 结果如下: - 26 - 说明:第一行是说使用bash 编译环境。第二行是说将参数的个数赋给变量count 。第三 是说使用cmd 变量代替内置命令echo ,就是说cmd 具有内置命令echo的功能。 四行是做了一个while循环当条件为真是进入循环体,即第五行到第八行之间的代码。 第六行是将获得的结果用cmd 存起来。第七行是count 自减一。第九行是先将$cmd 扩展成要执行的命令,然后再执行。 6.编写一个脚本,求斐波纳奇数列的前十项及总和。 脚本程序如下: 7. 设计一个程序cuts ,它的标准输入读取数据,获取由第一个参数n 和第二个参数m 所 限定范围的数据,n 和 m 都是整数,即从输入的字符串中抽取第n 个字符至第m 个字符之间的所有字符(包括这两个字符)。 示例程序如下所示: 8. 脚本定义了两个函数:getc() 和 press_any_key() 。 脚本代码如下所示: - 27 - 运行 $bash 4_8.sh 结果如下所示: 如果我们第六行注销掉再运行 $bash 4_8.sh 结果如下所示: 这个差别很明确就是第二行没有显示‘A’呀!可是为什么呢?下面我们将但不跟踪脚本的运行,原因就一目了然了。 运行 $bash –x 4_8.sh 运行完结果如下所示: [原来的脚本] - 28 - 注销掉第六行再运行 $bash –x 4_8.sh 运行完结果如下所示: 从两次运行的步骤就可看出差别,接着我将就为什么会出现这种情况作出解释,即第六行中eval 的作用。内置命令eval 强制shell 对该行进行两次扫描:一次将$1 扩展到变量名中,接着执行替换后的命令。 - 29 - 第五章 常用开发工具 一.实验目的 1.掌握C语言编译的基本用法 2.掌握gdb调试工具的基本用法 3.理解make工具的功能,学会编制makefile 的方法 二.实验内容 1.利用gcc编译C语言程序,使用不同选项,观察并分析显示结果(随意编写一C文件cc.c) 2.利用gdb调试一个编译后的C语言程序(自己编写C文件sort.c) 3.编写一个由多文件构成的C语言程序,编制makefile,运行make工具进行维护。 三、主要实验步骤 1.利用gcc编译C语言程序,使用不同选项,观察并分析显示结果(随意编写一C文件cc.c) $gcc cc.c //直接编译源文件cc.c $./a.out //运行可执行文件 a.out $gcc cc.c -o exe //-o 指定生成文件名 $./exe //运行可执行文件exe $gcc -E cc.c -o cc.i // 预处理 $gcc cc.i -o cc $./cc 2.利用gdb调试一个编译后的C语言程序(自己编写C文件sort.c) $gcc -g sort.c -o debug // -g 选项编译用以调试 $ gdb debug //进入调试环境 用gdb调试 debug (gdb)list 1,30 // 显示源码 (gdb)break 12 //增加断点 (gdb)run //运行到断点 (gdb)step //单步运行 回车继续... (gdb)p a[j] //显示a[j]值 ... //若干命令 (gdb)quit //退出调试环境 3.编写一个由多文件构成的C语言程序,编制makefile,运行make工具进行维护。 //文件1, bubbleSort.c void bubbleSort(int a[], int n) { } int i,j; for(i=0; i for(j=0; j if(a[j] > a[j+1]) swapdata(a+j, a+j+1); - 30 - //文件2,swapdata.c void swapdata(int *a, int *b) { } *a = *a + *b; *b = *a - *b; *a = *a - *b; //文件3,selectSort.c void selectSort(int a[], int n) { } //文件4,main.c #include int a[]={9,1,5,11,7,3,2,8,6,4,0}; int len=sizeof(a)/sizeof(int); int i=0; for(i=0; i printf(\puts(\bubbleSort(a, len); for(i=0; i printf(\putchar(10); int i,j,max; for(i=0; i max = i; for(j=i+1; j if( a[max] < a[j]) max = j; swapdata(a+max, a+i); if(max != i) //文件5,makefile sort.exe:main.o bubbleSort.o selectSort.o swap.o gcc main.o bubbleSort.o selectSort.o swap.o -o sort.exe main.o:main.c - 31 - gcc -c main.c -o main.o gcc -c bubbleSort.c -o bubbleSort.o gcc -c selectSort.c -o selectSort.o gcc -c swapdata.c -o swap.o bubbleSort.o:bubbleSort.c selectSort.o:selectSort.c swap.o:swapdata.c #make clean 命¨1令¢?执??行D以??下?内¨2容¨Y,ê?目?录?下?有?D文?件tclean也?2执??行D .PHONY:clean clean: rm sort.exe *.o 进入以上5个文件所在目录,运行 $make //make编译以上5文件 4.完成对思考题6.5的调试 见 ./6_5 ,调试步骤见: #include int main(int argc, char**argv) { } char *p; int i; p = malloc(30); strcpy(p,\printf(\if(argc == 2){ } /*free(p)*/ return 0; if(strcmp(argv[1], \ } p[50] = 'a'; //数oy组á¨|下?表à¨a越?界? free(p); p[0]='b';//非¤?法¤?§访¤?问¨o,ê?已??经-free(p) else if(strcmp(argv[1], \5.完成对思考题6.6的调试 //源文件如下,调试步骤见:二、2 #include - 32 - int main() { } int make_key(void) { } int get_key_num(void) { } int number(void) { } return 10; int ret = number(); return ret; int ret = get_key_num(); return ret; int ret = make_key(); printf(\exit(EXIT_SUCCESS); 6.完成对思考题6.9的编制,并使用make进行维护 //文件 makefile 以写好,源文件请自行解决 prog:a.o b.o c.o d.o assmb.o gcc a.o b.o c.o d.o assmb.o -L/home/user/lib -lm -o prog gcc -c a.c -o a.o gcc -c b.c -o b.o gcc -c c.c -o c.o gcc -c d.c -o d.o as -o aassmb.o assmb.s a.o:a.c b.o:b.c defs.h c.o:c.c d.o:d.c defs.h assmb.o:assmb.s .PHONY:clean clean: rm prog *.o //自己按照要求编写题目中文件后运行 $make - 33 - 第六章、Linux环境编程 一、 实验目的 1. 理解系统调用和库函数的异同。 2. 学会用系统调用和库函数进行编程。 3. 掌握一些常用的系统调用和库函数的功能及应用。 二、 实验内容 1. 2. 3. 4. 使用系统调用对文件进行操作。 使用系统调用对进程进行操作。 使用管道机制进行I/O。 使用信号机制进行进程通信。 三、 主要实验步骤 1. 编写一个程序,把一个文件的内容复制到另一个文件上,即实现简单的copy 功能。 要求:只用open(),read(),write()和close()系统调用,程序的第一个参数是源文件,第二个参数是目标文件。 示例代码如下所示: #include void file_copy(char *fname_str1, char *fname_str2) { int fd1,fd2,nbytes; char buf[10]; if( (fd1=open(fname_str1,O_RDONLY))<0 ) { printf(\ exit(EXIT_FAILURE); } if( (fd2=open(fname_str2,O_WRONLY))<0 ) { printf(\ exit(EXIT_FAILURE); } while( (nbytes=read(fd1,buf,10))>0 ) { if(write(fd2,buf,10)<0) { printf(\ - 34 - } } close(fd1); close(fd2); exit(EXIT_SUCCESS); } int main(void) { char fnamestr1[20], fnamestr2[20]; printf(\ printf(\ scanf(\ printf(\ scanf(\ file_copy(fnamestr1,fnamestr2); return 0; } 2.编写一个程序,它利用fork() 创建一个子进程;父进程打开一个文件,父进程向管道中写信息,子进程从管道中读信息。打印每个进程的两个ID号。最后父进程执行waitpid()。另外如果没有waitpid调用,会出现什么情况? 示例如下所示: #include int main(int argc, char *argv) { int fd[2]; int len; pid_t pid; pid_t current_process; pid_t parent_process; char filename[10]; char childbuf[10]; //create a pipe if (pipe(fd) < 0) { perror(\ exit(1); } //create the child process if ((pid = fork()) < 0) { perror(\ exit(1); - 35 - } if (pid == 0) { close(fd[1]); len = read(fd[0], childbuf, 100); childbuf[len] = '\\0'; printf(\ current_process=getpid(); parent_process=getppid(); printf(\ printf(\ printf(\ printf(\ if (execlp(\ perror(\ exit(1); } } else { close(fd[0]); printf(\ current_process=getpid(); parent_process=getppid(); printf(\ printf(\ printf(\ scanf(\ write(fd[1], filename, strlen(filename)); //wait the pid process quit waitpid(pid, NULL, 0); return 0; } } 管道就是为了暂时存储东西的,int pipe(int filedes[2]); filedes[0]是表示管道的读端,filedes[1]是表示管道的写端。若成功,则返回0,失败,返回-1 。 执行结果如下所示: - 36 - 可是如果把倒数第四行waitpid(pid, NULL, 0);注释起来的话。结果又会怎么样呢? 运行结果如下所示: 我可以从结果不难看出,当前进程在子进程没有退出之前就提前退出了。 3.编写一个程序,尽可能多地输出有关当前进程的信息:PID、PPID、打开文件、当前目录、nice值等。你如何确定文件是否打开?如果多个文件描述符表示同一个文件,请简要说明。(同样地,如何确定?) 示例如下所示: #include int main(int argc, char *argv) { int fd[2]; int len,n,fd1,fd2; pid_t pid; pid_t current_process; pid_t parent_process; char filename[10]; char childbuf[10]; if (pipe(fd) < 0) { perror(\ exit(1); } //create the child process if ((pid = fork()) < 0) { perror(\ exit(1); - 37 - } if (pid == 0) {} else { close(fd[0]); printf(\ current_process=getpid(); parent_process=getppid(); printf(\ printf(\ printf(\ scanf(\ if( (fd1=open(filename,O_RDONLY))>=0) { printf(\ } if( (fd2=open(filename,O_WRONLY))>=0) { printf(\ } waitpid(pid, NULL, 0); return 0; } } 说明:fd1,fd2 是文件描述符,表示同一个文件cai.txt。但是作用不同。 运行结果如下所示: 4.编写一个程序,他创建一个子进程。父进程向子进程发送一个信号,然后等待子进程终止;子进程接收信号,输出自己的状态信息,最后终止自己。 示例如下所示: #include - 38 - { printf(\ exit(EXIT_FAILURE); } if(pid==0) { printf(\ printf(\ printf(\ sleep(1); kill(getpid(),NULL); } else { printf(\ printf(\ printf(\ if( (kill(pid, SIGTERM))<0) { printf(\ } else { printf(\ } waitpid(pid, NULL,0); } } 运行结果如下所示: - 39 - 第七章 - 40 -