《Linux操作系统》实验报告模板
课程编号:B080103040 Linux 操作系统 实验报告 姓 名 姚柯杰 学 号 ******** 班 级 软工 1212 指 导 教 师 石 凯 实验名称 Linux 操作系统实验 开 设 学 期 2014-2015 第 一 学 期 开 设 时 间 第1 1 周 — — 第1 8 周 报告日期 评 定 成 绩 评定人 石 凯 评 定 日 期 东北大学软件学院 实验一 熟悉 Linux 环境 一、举例列出常用的 shell 命令使用方法 1.目录操作 (1)mkdir abc 创建一个目录 abc (2)cd /abc 将工作目录改变到 abc (3)cd 改变当前目录到主目录 (4)ls 列出当前目录的内容 (5)ls -l 输出当前目录内容的长列表,每个目录或文件占一行 (6)pwd 显示当前目录的全路径 2.文件显示实用程序 (1)cat mx.c 显示 mx.c 文件内容 (2)more mx.c 分屏显示 mx.c 内容 (3)cat file1 file2 连接 file1 和 file2 3 文件管理实用程序 (1) cp file1 file2 将文件 1 复制到文件 2 (2)mv file1 file2 将文件重命名为 file2 (3)rm filename 删除文件 filename 二、通过实例写出 Linux 下 C 程序编辑运行过程。 在终端命令下输入 vi filename 命令,这里我输入 vi helloworld.c 创建并打开 helloworld.c 文件 按 i 进入编辑模式,输入下列 code: # include void main(void) { Printf(“hello world!\n”);} 输入:wq 保存退出 输入 cc helloworld.c 编译,在输入./a.out 运行 三、实验总结 在实验一中,我初步对 linux 有了初步的了解,能熟练目录和文件进行操作,并且能 用 linux 进行基本简单的基于 c 的编程。师傅领进门,修行在个人,算是通过这个实验进入 了 linux 的门。 实验二 文件操作 一、实现 CP 命令 实现思路:提取出源路径和目标路径到函数中,放于定义的两个 int 变量,定义缓冲 区 buf,对两个变量进行判断,如果符合要求打开读取源文件信息存于缓冲区,然后写到目 标文件中,关闭两个文件以实现等同 cp 效果。 此处以 hello。C 文件为源文件,目标文件 1.c。 在调试 cp 命令中,由于一开始并未定义缓冲区,导致程序出错,后假如缓冲区,程序得以 正常运行。 二、实现 ls 命令 实现思路: 调用dirent.h来实现打开目录流, 定义变量, 随后对变量进行判定用opendir、 readdir 打开并读取目录流,将值传递给另一个变量,打印出来。 编译源程序并运行: 在实现 ls 命令中使用 man 手册查找需要的 dir 等目录流信息, man 是个强大的命令, 在编程 的过程中由于疏忽一开始并未假如判断条件, 有些突发情况会难以处理, 最后通过课件修过 过来。 三、设备文件操作 鼠标对应的设备文件是 /dev//mice 实验三 进程间通信 (一)进程的创建(必做题) 编写一段程序,使用系统调用 fork( )创建两个子进程,在系统中有一个父进程和两个 子进程活动。让每个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示 字符“b” 和“c”。试观察记录屏幕上的显示结果,并分析原因。 创建一个新的子进程。其子进程会复制父进程的数据与堆栈空间。Fork 成功则在父进 程会返回新建立的子进程 pid, 而在新建立的子进程中则返回 0。 如果 fork 失败则直接返回 -1。所以在循环条件上出现上述情况。 修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行时屏 幕上出现的现象,并分析其原因。(必做题) 子进程创建成功,到下一个 while,第二个子进程成功到最后循环,输入 parents1-500,随后 返回继续上面子进程的循环输出。 【思考题】 1.系统是怎样创建进程的? 答:在 UNIX 系统中,只有 0 进程是在系统引导时被创建的, 在系统初启时由 0 进程创建 1 进程,以后 0 进程变成对换进程,1 进程成为系统中的始祖进 程。 UNIX利用fork( )为每个终端创建一个子进程为用户服务, 每个终端进程又可利用fork( ) 来创建其子进程,从而形成一棵进程树。 2.当前运行的程序(主进程)的父进程是什么? 建立如下的 c 文件来获取 pid 得到这三个进程 pid,可见父进程的 pid 是 5182。 (二)信号量机制实验 【实验内容】 1.编写一段程序,使用系统调用 fork( )创建两个子进程,再用系统调用 signal( )让父进 程捕捉键盘上来的中断信号(即按 ctrl+c 键),当捕捉到中断信号后,父进程用系统调用 kill( )向两个子进程发出信号,子进程捕捉到父进程发来的信号后,分别输出下列信息后 终止: Child process 1 is killed by parent! Child process 2 is killed by parent! 父进程等待两个子进程终止后,输出以下信息后终止: Parent process is killed! 实验要求: ⑴ 运行程序并分析结果。 ⑵ 如果把 signal(SIGINT,stop)放在①号和②号位置,结果会怎样并分析原因。 ⑶ 该程序段前面部分用了两个 wait(0),为什么? ⑷ 该程序段中每个进程退出时都用了语句 exit(0),为什么? 程序代码: # include #include # include # include #include #include int wait_mark; void waiting(),stop(); void main() { int p1, p2; signal(SIGINT,stop); while((p1=fork())==-1); if(p10) {// while((p2=fork())= =-1); if(p20) { // wait_mark=1; waiting(0); kill(p1,10); kill(p2,12); waiting(); waiting(); printf(“parent process is killed!\n“); exit(0); } else { wait_mark=1; signal(12,stop); waiting(); lockf(1,1,0); printf(“child process 2 is killed by parent!\n“); lockf(1,0,0); exit(0); } } else { wait_mark=1; signal(10,stop); waiting()