操作系统实验指导Word格式文档下载.docx
《操作系统实验指导Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
熟悉linux的基本命令
熟悉运用Linux的在线求助系统。
(maninfohelp)
1,文件与磁盘操作
man/infocdls(-a-l-h-t)cp(-R-f-l)mvcat/less/morepwdmkdirrm(-r-f)chmod[-R]user[:
group]filefind(-name-user)grepdf(-h)mount/umountcleartime
2,用户管理
useradd(-g-d-s-G)userdel(-r)passwdgroupadd/groupdelgpasswd(-a-d)sukernelversionhostname
3,软件安装
rpm(-i-e-ivh-U-q-qa-qd-ql-qi-qR)tar
4,网络命令
ifconfig(up/down)netstate(-t-p-u)
5,进程管理
ps(-a-f-x)pstree-pukill-9pidldconfig
killallreboothalt
实验二命令接口的使用
1.熟练使用vi编辑器
2,熟悉Shell程序的设计
实验内容:
1vi编辑器的使用
1,三种模式
进入命令模式
vi<
文件名>
进入编辑模式
i/Ia/Ao/OESC
进入特殊模式
:
q:
q!
:
e!
w:
wq:
wqfile:
n1,n2wfile
rfile
efilename
!
command
2,光标移动
bejklh0$ctrl+fctrl+b
n+spacen+enter6GGHL
3,删除操作
xdwDdd
4,替换操作
rcwCcc
5,查询命令
/abc?
abcnN:
n1,n2s/word1/word2/gc
6,拷贝粘贴
yY2yypP
7,其他命令
:
setnu;
setnonu;
u.;
vyp
gfCTRL-SHIFT-6
2shell程序的编写
环境变量
echoenvset$“”‘’?
``
(1)熟悉shellscript的结构和运行、调试方法。
(2)熟悉shellscript的变量声明方法及其输入输出。
declare–ia=3;
read
(3)熟悉shellscript的分支结构。
编写shellscript文件test1.sh,判断用户根目录下是否有名为test的文件或者目录,如果有的话,将其删除。
if[-etest];
thenxxxelsexxxfi
(4)熟悉shellscript的循环结构。
编写shellscript文件test2.sh,实现1到100所有奇数的和并输出。
试验三linux的C语言开发
试验目的
熟悉gcc的使用
熟悉gdb的使用
熟悉make的使用
试验内容
1gcc
(1)过程
gcchello.c–ohello
输入选项输出命令注释
.c-E.icpp预编译,文件包含、条件编译、宏展开
.i-S.scc1编译,生成汇编文件,注意命令的路径
.s-c.oas汇编,生成目标文件
.o[ELF]ld链接
(2)常用选项
-v显示进度
-W[all]显示警告信息
-I头文件路径,不要空格
-L库路径,不要空格
-lName库名字(libName.或者libName.so)
-shared编译成共享库
-static链接静态库
-fpic[fPIC]编译成共享库
-O[n]优化
-Dmacro=BAR在命令行定义预处理宏FOO,其值为BAR
-Wl,option传递给ld程序option选项,比如-Wl,-dn和-Wl,-dy
注意区别:
gcchello.c–ohello.static–Wl,-dn[-Bstatic][-static]
gcchello.c–ohello.dynatic–Wl,-dy[-Bdynamic]默认
(3)c++
编写hello.cxx程序:
#include<
iostream.h>
usingnamespcestd;
intmain()
{
Cout<
<
”hello”<
endl;
Return0;
}
编译命令:
g++hello.cxx-ohello
(4)静态库的建立和使用
a)建立
gcc-cadd.c
gcc-csub.c
ar-rlibaddsub.aadd.osub.o(查ar命令,注意/r/t/x的用法)
b)调用
gcctest2.c-otest2.static-I./-L./-Wl,-dn–laddsub
-Wl,-dn后面的库使用静态版本
(5)共享库的建立和使用
gcc-fpic[-shared]add.csub.c-olibaddsub.so
b)安装
为了让动态链接库为系统所认识及共享,就需要运行ldconfig命令。
(manldconfig,注意命令作用)
默认目录/lib和/usr/lib
配置文件/etc/ld.so.conf内所列的目录
缓存文件/etc/ld.so.cache
四种安装方式:
#cplibaddsub.so/usr/bin#ldconfig
#pwd>
>
/etc/ld.so.conf#ldconfig
#ldconfig`pwd`//更新缓存无效
#exportLD_LIBRARY_PATH="
."
//另开shell则无效
c)共享调用
gcctest2.c-otest2-I./-L./-Wl,-dy–laddsub
-Wl,-dy用于指定链接动态库版本,默认
d)动态调用
Linux提供4个库函数(dlopen,dlerror,dlsym和dlclose),一个include文件(dlfcn.h)以及两个共享库(静态库libdl.a和动态库libdl.so),以支持动态链接装入器。
gcctest2.c-otest2–ldl
参考:
stdio.h>
dlfcn.h>
inta,b;
scanf("
%d,%d"
&
a,&
b);
void*pHandle;
int(*sub)(intm,intn);
pHandle=dlopen("
libsub.so"
RTLD_LAZY);
sub=dlsym(pHandle,"
sub"
);
printf("
%d\n"
sub(a,b));
dlclose(pHandle);
return0;
附:
几个命令
ldd查看文件的依赖关系
nm查看文件的符号表,比如:
nmtest2|grepadd
objdump查看文件的信息
2gdb
(1)准备gcc-g
(2)打开gdbfilename/filefilename
(3)运行run/next/step(进入子程序)/continue
(4)设置断点break/delete
(5)显示表达式的值
printexp立即输出表达式的值
watchexp表达式的值发生变化时,程序停止并输出其新旧值
displayexp程序一旦停止就显示表达式的值
(6)显示栈的信息
backtrace/backtracefull
frametraceNum
(7)显示程序的信息
list/listnum/listfunc
infobreakpoints/infobreak
infofunc/intovar/infofiles
infolocal/infoprog/infoargs
disassemblefunc/infoframe/examine(x)addr
(8)退出quit帮助help执行命令shellcommandstr
3make
(1)Make命本:
Make[flags][macrodefinitions][targets]
[flags]如果没有"
-f"
参数,则系统将默认当前目录下名为makefile或者名为Makefile的文件为描述文件。
在Linux中,GNUmake工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜索makefile文件。
[macrodefinitions]makefile文件中的变量定义
[targets]make的目标,默认是makefile文件中的第一个目标
(2)makefile文件:
规则的集合
a:
b
command
a为目标。
可以是.o,也可以是ELF,还可以是一个伪目标。
b为依赖文件。
就是,要生成那个a所需要的文件或是目标。
command也就是make需要执行的,从b生成a的命令
(3)其他
变量:
定义CFLAGS=-c引用$(CFLAGS)
特殊变量$@目标文件,$^所有的依赖文件,$<
第一个依赖文件
命令:
不显示命令内容@
命令出错不处理-
多条相关命令;
伪目标与自动推导:
add.o:
addsub.h
.PHONY:
clean
clean:
rmedit$(objects)
文件搜索:
特殊变量VPATH=./include:
../include
特殊指令vpath%.h./include:
4实验任务
(1)编写程序:
main函数所在的文件名字为test3.c,程序功能为从键盘输入两个数求其和(调用add.c中的函数)和差(调用sub.c中的函数)。
(2)编写一个makefile文件,并用make编译刚才的程序
(3)设置断点,观察点,调试程序
实验四linux多进程设计
1.了解进程与程序的区别,加深对进程概念的理解;
2.了解fork()系统调用的返回值,掌握用fork()创建进程的方法;
1,用vi输入下面的程序,编译、调试、输出结果
#include<
sys/types.h>
unistd.h>
intmain()
{
pid_tchild_pid;
/*fork函数
*作用:
系统调用,产生一个子进程,调用一次返回两次
*返回值:
pid_t类型,在头文件中定义,通常为整形
*0子进程返回
*ID父进程返回的子进程ID
*/
child_pid=fork();
if(child_pid==0)
{
inti=0;
for(;
i<
5;
i++)
{
printf("
child\n"
sleep
(1);
//waitonesecond
}
}
else
printf("
child'
spidis%d"
child_pid);
intj=0;
for(;
sleep
(1);
}
2,用man察看fork、sleep的用法
3,试验任务
编写一C语言程序,实现在程序运行时通过系统调用fork()创建两个子进程,使父、子三进程并发执行,父亲进程执行时屏幕显示“Iamfather”,儿子进程执行时屏幕显示“Iamson”,女儿进程执行时屏幕显示“Iamdaughter”。
实验五Linux进程间的同步
1.掌握进程并发执行的原理,理解进程并发执行的特点,区分进程并发执行与串行执行;
2.熟悉wait、exit等系统调用。
3.熟悉信号同步的方法。
1.用man察看wait、exit的用法
2.修改实验四的程序,在父、子进程中分别使用wait、exit等系统调用“实现”其同步推进,多次反复运行改进后的程序,观察并记录运行结果。
实验六Linux进程间的通信
学习如何利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通信,并加深对上述通信机制的理解。
1.了解系统调用pipe()、msgget()、msgsnd()、msgrcv()、msgctl()、shmget()、shmat()、shmdt()、shmctl()的功能和实现过程。
semget()semop()semctl()
2.编写一C语言程序,使其用管道来实现父子进程间通信。
子进程向父进程发送字符串“issendingamessagetoparent!
”;
父进程则从管道中读出子进程发来的消息,并将其显示到屏幕上,然后终止。
3.运行该程序,观察、记录并简单分析其运行结果。
实验七Linux文件操作
复习标准C语言的文件操作函数,熟悉linux有关文件操作的系统调用,并理解他们之间的关系。
1、标准的文件操作的函数
文件指针(FILE)
fopen/fclose,fread/fwrite,fputc/fgetc,fprintf/fscanf,fseek/frewind,remove,rename,feof
2、系统调用中的文件操作
#incldue<
sys/stat.h>
fcntl.h>
文件描述符(int)
open/close,creat/unlink,read/write,lseek,eof
mkdir/rmdir,opendir/closedir,readdir,stat,access
3.建立一个目录(mkdir),在目录下建立两个文件(creat)a.txt、b.bin;
在a.txt中输入你的姓名和学号;
在b.bin中输入你的年龄的二进制表示。
4.编写程序实现对文本文件指定行的读取。
附录
man的使用
1,man的介绍
linux下的man页包括用户命令、系统调用、库函数等的帮助文档。
其中每一类别对应一个section,每一个section对应一个数字id。
常用的类别以及对应的数字如下:
(1)用户命令Usercommands
(2)系统调用Systemcalls
(3)标准库函数Standardlibraryfunctions
(8)系统管理命令System/administrativecommands
2,man的命令行参数
详细参考#manman,常见的有
(以sleep为例子)
#mansleep显示用户命令
(1)中sleep的man页
#man3sleep显示库函数(3)中sleep的man页
#man-fsleep显示名称为sleep的所有man页
#man-ksleep显示行描述中包含sleep的所有man页
#man-Ksleep显示页内包含sleep的所有man页
3,man的浏览命令
详细输入h或者H查看,常见的有
w向下翻一页
d向上翻半页
f向上翻一页
e向下翻一行
y向上翻一行
/str向下搜索str
?
str向上搜索str
n下一个str
help命令
1,ar–help
2,(gdb)help等
设置环境变量:
全局设置:
直接修改/etc/profile
针对用户修改:
修改~/.bashrc~/.bash_profie
添加变量:
exportPEAK=“zhaofeng”:
peakzhao:
$PEAK
删除变量:
unsetPEAK
其他命令:
env/set