linux实验报告
更新时间:2023-09-30 17:08:01 阅读量: 综合文库 文档下载
Linux操作系统 实验报告
姓 名 班 级 实验名称 学 号 指 导 教 师 Linux操作系统实验 2014-2015第一学期 第11周——第18周 开 设 学 期 开 设 时 间 报告日期 评 定 成 绩 评定人 评 定 日 期
目 录
实验报告一熟悉Linux环境 ......................................................................................................... 4
【实验目的】 ......................................................................................................................... 4 【报告内容】 ......................................................................................................................... 4 一、常用的Shell命令 ......................................................................................................... 4
1.目录操作 ...................................................................................................................... 4 2.文件显示实用程序 ...................................................................................................... 5 3.文件管理实用程序 ...................................................................................................... 6 4.数据操作实用程序 ...................................................................................................... 6 5.其他实用程序 .............................................................................................................. 7 二、Linux下C程序编辑运行过程 ...................................................................................... 7
1.Linux下编写C程序编辑运行过程的步骤 ............................................................... 7 2.Linux下C程序编辑运行命令执行的形式和内容 ................................................... 8 三、实验心得总结 ................................................................................................................. 8 实验报告二文件操作 ..................................................................................................................... 8
【实验目的】 ......................................................................................................................... 8 【报告内容】 ......................................................................................................................... 8 一、文件的创建 ..................................................................................................................... 8
1. 使用vi命令编写程序read.c .................................................................................... 8 2.实现cp命令的功能 .................................................................................................... 9 二、查看目录内容及文件属性 ............................................................................................. 9
1.编写程序,实现ls -l的功能 ...................................................................................... 9 2.编写程序,实现ls -R的功能 ................................................................................... 10 三、设备文件操作 ............................................................................................................. 11 四、程序设计思路和方法 ................................................................................................. 11 五、实验总结 ..................................................................................................................... 12 实验报告三进程间通信 ............................................................................................................. 12
(一)进程创建实验 ......................................................................................................... 12
【实验目的】 ............................................................................................................. 12 【报告内容】 ............................................................................................................. 13 一、进程的创建 ......................................................................................................... 13
1.进程的创建 ..................................................................................................... 13 2.进程的创建 ..................................................................................................... 13 二、程序设计思路和方法 ......................................................................................... 14 三、思考题 ................................................................................................................. 15 四、实验总结 ............................................................................................................. 15 (二)信号量机制实验 ..................................................................................................... 15
【实验目的】 ............................................................................................................. 15 【报告内容】 ............................................................................................................. 15 一、软中断通信 ......................................................................................................... 15 二、流程图 ................................................................................................................. 19 三、实验总结 ............................................................................................................. 20 (三)进程的管道通信实验 ............................................................................................. 20
2
【实验目的】 ............................................................................................................. 20 【报告内容】 ............................................................................................................. 20 一、进程的管道通信 ................................................................................................. 20 二、流程图 ................................................................................................................. 23 三、实验总结 ............................................................................................................. 24 (四)消息的发送与接收实验 ......................................................................................... 24
【实验目的】 ............................................................................................................. 24 【实验内容】 ............................................................................................................. 24 一、消息的发送与接收 ............................................................................................. 24 二、程序设计思路和方法 ......................................................................................... 26 三、实验总结 ............................................................................................................. 27
实验四编写Web服务器 ............................................................................................................. 27
【实验目的】 ..................................................................................................................... 27 【报告内容】 ..................................................................................................................... 27 1.服务器设计重点 ........................................................................................................... 27 2.三个主要操作 ............................................................................................................... 27 3.连接过程 ....................................................................................................................... 28
操作1:建立服务器端socket ........................................................................... 28 操作2:建立到服务器的连接 .......................................................................... 29 操作3:客户/服务器的会话 ............................................................................. 31
4.编写Web服务器 ......................................................................................................... 32
3
实验报告一熟悉Linux环境
【实验目的】
1.了解Linux系统基本操作方法,学会独立使用该系统。 2.熟悉Linux下如何编辑、编译和运行一个C语言程序。 3.学会利用gcc、gdb编译、调试C程序。
【报告内容】
一、常用的Shell命令
1.目录操作
根据实际操作,其命令执行的书写形式和简略内容如下: (1) 使用mkdir命令创建一个目录abc [qdf@localhost ~]$ mkdir abc (2)使用cd命令将工作目录改变到abc [qdf@localhost ~]$ cd haha abc (3)使用cd 命令改变当前目录到主目录qdf [qdf@localhost ~]$ cd abc qdf (4)使用ls命令列出当前目录的内容
4
(5)使用ls -l命令输出当前目录内容的长列表
(6)使用pwd 命令显示当前目录的全路径
2.文件显示实用程序
根据实际操作,其命令执行的书写形式和简略内容如下: (1)使用vi命令编写程序mx.c [qdf@localhost ~]$ vi mx.c
(2)使用cat命令显示mx.c文件内容
(3)使用more命令分屏显示mx.c内容
5
(4)使用cat命令连接file1 和file2 [qdf@localhost ~]$ vi file1 file2 [qdf@localhost ~]$ cat file1 file2 abcdef 123456
3.文件管理实用程序
根据实际操作,其命令执行的书写形式和简略内容如下: (1)使用cp将文件1复制到文件2 [qdf@localhost ~]$ cp file1 file2 [qdf@localhost ~]$ cat file2 abcdef
(2)使用mv命令将文件file1重命名为file2 [qdf@localhost ~]$ cat file1 A-B-C-D-E-F-G
[qdf@localhost ~]$ mv file1 file2 [qdf@localhost ~]$ cat file2 A-B-C-D-E-F-G
(3)使用rm命令删除文件filename [qdf@localhost ~]$ rm filename [qdf@localhost ~]$ cat filename cat: file2: 没有那个文件或目录 4.数据操作实用程序
根据实际操作,其命令执行的书写形式和简略内容如下: (1)使用tty命令显示当前终端的路径和文件名 [qdf@localhost ~]$ tty /dev/pts/6
(2)使用who命令显示当前登录用户的列表
6
5.其他实用程序
根据实际操作,其命令执行的书写形式和简略内容如下: (1)使用date命令输出系统日期和时间 [qdf@localhost ~]$ date
2014年 12月 01日 星期一 09:12:50 CST
(2) 使用history命令显示以前执行过的命令的列表
二、Linux下C程序编辑运行过程
1.Linux下编写C程序编辑运行过程的步骤
⑴命名C程序为hello.c,同时启动vi编辑器,并键入C源程序代码,具体如下: #include
printf(“Hello world!!!\\n”); }
⑵编译源程序,即用gcc编译器对hello.c进行编译,以生成hello.out。方法如下: gcc -o hello.out hello.c ↙ ⑶键入一条指令,运行hello.out。 ./ hello.out ↙
7
2.Linux下C程序编辑运行命令执行的形式和内容 [qdf@localhost ~]$ vi hello.c
[qdf@localhost ~]$ gcc -o hello.out hello.c [qdf@localhost ~]$ ./hello.out Hello world!!! [qdf@localhost ~]$
三、实验心得总结
刚开始由对Linux基本不了解到能独立安装Linux虚拟机以及可以独立编写一些简单的shell命令,我认为这就是一种进步。本次实验共四学时,实验期间对Linux系统基本操作方法有了深入的了解,进一步巩固了常用的shell命令,如显示文件内容的命令:cat、more、less、head、tail;文件的创建与删除的命令:mkdir、rmdir;改变工作目录、显示路径以及显示目录内容的命令:cd、pwd、ls等等。
此外,在具体的实验内容指导下,能熟悉地利用vi命令打开编辑器(如vi hello.c命令就是编辑一个名为hello.c的C源程序),更改所编写的文本或计算机程序的文件名或目录名(如cd f1 f2就是将f1文件名更改为f2),修改其内容或删除已建的文件或目录(如rm hello.c就是删除名为hello.c源程序文件),同时熟悉了在Linux系统下如何编辑、编译和运行一个C语言程序。
实验报告二文件操作
【实验目的】
1.掌握文件的概念及对文件的操作。 2.掌握对目录及文件系统的操作。 3.掌握对设备文件的操作。
【报告内容】
一、文件的创建
1. 使用vi命令编写程序read.c main(int ac, char *av[]){
8
}
2.实现cp命令的功能
int fd;
char buf[]=[512]; fd=open(av[1], O_RDONLY); printf(“%.*s\\n”,n,buf); close(fd); int n;
while((n=read(fd,sizeof,buf,sizeof(buf)))>0)
二、查看目录内容及文件属性 1.编写程序,实现ls -l的功能
(1)使用vi命令编写程序lsone.c: main(int ac, char *av[]){ }
(2)实现ls -l的功能。
DIR * dirp; struct dirent * p; if(1==ac){ }
while((p=readdir(dirp))!=NULL){ }
closedir(dirp);
if(p->d_name[0]!='.'){ }
printf(\dirp=opendir(\dirp=opendir(av[1]); }else{
9
2.编写程序,实现ls -R的功能
(1)编写程序open.c: main(int ac, char *av[]){ int fd; int n; char buf[512];
fd=open(av[1], O_RDONLY); while((n=read(fd, buf, 512))>0){ printf(\
}
close(fd);
}
(2)实现ls -R的功能 [qdf@localhost ~]$ cc open.c [qdf@localhost ~]$ ./a.out [qdf@localhost ~]$
10
[qdf@localhost ~]$ ls -R open.c open.c
三、设备文件操作
1.在/dev目录下,查找鼠标对应的文件
2.打开这个文件,并循环读出字符,且将字符对应的ascII代码显示在终端上 (1)使用vi命令编写程序readmice.c main(int ac, char *av[]){ }
int fd; char buf[512];
fd=open(\while((n=read(fd, &buf, sizeof(buf)))>0) printf(\close(fd);
int n;
四、程序设计思路和方法
1.使用vi命令编写程序read.c创建文件,使用cp命令将程序read.c重命名为readcp.c,实现文件的复制。
2.使用vi命令编写程序lsone.c,使用ls -l命令分别实现打印出当前目录文件及其属性
11
和在终端显示给定目录下的文件及其属性。使用mkdir命令创建目录ls1。 3.使用vi命令编写程序open.c,使用ls -R命令查看目录内容及文件属性。
4.使用ls命令查找鼠标对应的文件,并打开文件,将循环读出的字符对应的ascII代码显示在终端上。
五、实验总结
本次实验应用到了vi命令、cp命令、ls -l命令、mkdir命令、ls -R命令等等,分别实现了文件的创建、文件的复制、打印出当前目录文件及其属性以及在终端显示给定目录下的文件及其属性。在上机过程中偶尔会出现代码命令输入错误的情况,以致没有达到实验目的。不过,这是由于不细心导致的结果,因此我又重新输入命令,最后成功达到实验目的。此外在上机准备实现设备文件操作的功能时,由于不熟悉操作流程,进入误区,幸好在笔记上记录了使用ls命令将鼠标对应的文件显示在终端上。总之,本次实验收获很多,对Linux文件操作也有了很大程度的掌握。
实验报告三进程间通信
UNIX/LINUX系统的进程间通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉LINUX支持的信号量机制、管道机制、消息通信机制及共享存储区机制。
(一)进程创建实验
【实验目的】
1.掌握进程的概念,明确进程和程序的区别。 2.认识和了解并发执行的实质。
3.分析进程争用资源的现象,学习解决进程互斥的方法。
12
【报告内容】
一、进程的创建
1.进程的创建
(1) 使用vi命令编写程序forkcp1.c: #include
while((p1=fork())==-1); if(p1==0)
putchar('B'); else
{ while((p2=fork())==-1); if(p2==0) putchar('C'); else } }
(2)运行结果:
putchar( 'A');
(3)分析原因:
从进程执行并发来看,输出ABC的排列都是有可能的。因为fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不是一定是顺序的,所以输出ABC的排列都是有可能的。 2.进程的创建
(1) 使用vi命令编写程序forkcp2.c:
# include
{ int p1, p2, i;
while((p1=fork())== -1); //创建子进程p1
13
if(p1==0)
for(i=0;i<500;i++)
printf(“daughter:%d\\n”,i); else
{ while((p2=fork())= =-1); //创建子进程p2 if(p2==0) for(i=0;i<500;i++)
printf(“son:%d\\n”,i); else
for(i=0;i<500;i++)
printf(“parents:%d\\n”,i); //父进程执行 } } (2)运行结果:
[qdf@localhost ~]$ cc forkcp2.c [qdf@localhost ~]$ ./a.out
(3)分析原因:
随着执行时间不同,输出结果的顺序有所不同。因为函数printf()输出的字符串之间不会被中断,因此,每个字符串内部的字符顺序输出时不变。但是,进程中的循环会由于进程被中断而中断。同程序forkcp1.c一样,多进程是随机的,所以输出的字符串的顺序会有不同的结果。
二、程序设计思路和方法
(1)本程序设计思路为当进程在屏幕上显示字符时,父进程显示字符“A”,子进程分别显示字符“B” 和“C”。于是编写名为forkcp1.c的程序,使用系统调用fork( )方法创建两个子进程,分别命名为p1、p2。
(2)用cp命令将程序forkcp1.c复制为forkcp2.c,使用系统调用fork( )方法创建两个子进程不变,只将程序forkcp1.c中每个进程的输出由单个字符改为一句话,通过相应的
14
for循环语句和printf()语句显示在屏幕上。
三、思考题
1.系统是怎样创建进程的?
答:系统通过调用fork函数创建进程,当一个进程调用了fork以后,系统会创建一个子进程。这个子进程除了它的进程ID和父进程ID不同之外,其他的都一样。在子进程与父进程各自执行自己的操作时,至于先执行子进程,还是先执行父进程,取决于去内核的调度算法。一旦子进程被创建,父子进程相互竞争系统的资源.有时候我们希望子进程继续执行,而父进程阻塞直到子进程完成任务.这个时候我们可以调用wait。 2.当前运行的程序(主进程)的父进程是什么? (1)forkcp1.c程序中putchar( 'A')为父进程。
(2)forkcp2.c程序中printf(“parents:%d\\n”,i)为父进程。
四、实验总结
本次实验主要使用系统调用fork( )方法创建两个进程,由于多进程是随机的,因此在实验过程中显示在终端上的结果不唯一。开始我以为代码有问题呢,但经过分析和多次调试发现是因为多进程具有随机性。实验过程中,我掌握了使用系统调用fork( )方法创建进程,对系统怎样创建进程以及怎样确定当前程序父进程都有了一定程度的了解。
(二)信号量机制实验
【实验目的】
1.了解什么是信号。
2.熟悉LINUX系统中进程之间软中断通信的基本原理。
【报告内容】
一、软中断通信
1.编写一段程序,使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到父进程发来的信号后,分别输出下列信息后终止:
Child process 1 is killed by parent!
15
Child process 2 is killed by parent!
父进程等待两个子进程终止后,输出以下信息后终止: Parent process is killed!
(1) 使用vi命令编写程序fork_kill.c: void main() { int p1, p2;
while((p1=fork())==-1); if(p1>0) { //①
while((p2=fork())==-1);
if(p2>0) { //②
wait_mark=1;
waiting(0); /*若无按键将等待*/ kill(p1,10); /*向进程1发送信号*/ kill(p2,12); /*向进程2发送信号*/ wait( );
/*在父进程中*/
/*在父进程中*/
signal(SIGINT,stop); /*接收键盘中断(按Ctrl+C键),转stop*/
wait( );
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();
lockf(1,1,0);
printf(“child process 1 is killed by parent!\\n”); lockf(1,0,0); exit(0);
/*在子进程1中*/
/*在子进程2中*/
}
16
}
void waiting() {
while(wait_mark!=0); }
void stop() {
wait_mark=0; }
(2)运行结果:
(3)分析原因:
进程的软中断通信是利用函数signal()和kill()来实现的,子进程中的signal()函数接收父进程kill()函数发来的信号来执行输出终止操作。父进程中的signal(SIGINT,stop)是用来启动按键(Ctrl+C)的,用来发送终止子进程的信号。实验结果如(2)运行结果所示。 (4)如果把signal(SIGINT,stop)放在①号和②号位置,结果会怎样并分析原因。
答:如果把signal(SIGINT,stop)放在(1)号和(2)号位置后,结果先输出child process 2 is killed by parent!然后输出parent process is killed!而不会输出child process 1 is killed by parent!因为在fork子进程1后,子进程1中没有设置对SIGINT信号的处理,当按下CTRL+C后,进程1默认为终止,所以没有输出。 (5) 该程序段前面部分用了两个wait(0),为什么?
答:该程序段前面部分用了两个wait(0),用两个wait(0)的作用是同时使两个子进程p1和p2发出软中断信号,而不用等待。
(6)该程序段中每个进程退出时都用了语句exit(0),为什么?
答:该程序段中每个进程退出时都用了语句exit(0),表示要结束进程,另外向父进程返回结束标志0 。
2.修改上面的程序,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),再观察程序执行时屏幕上出现的现象。 (1) 使用vi命令编写程序fork_kill2.c: void Int1() {
printf(“child process 1 is killed by parent !\\n”);
17
exit(0); }
void Int2() {
printf(“child process 2 is killed by parent !\\n”); exit(0); } main() {
int exitcode;
signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN); while((pid1=fork())==-1); if(pid1==0) {
signal(SIGUSR1,Int1); signal(SIGINT,SIG_IGN); pause(); exit(0); } else {
while((pid2=fork())= =-1);
if(pid2==0) {
signal(SIGUSR2,Int2); signal(SIGINT,SIG_IGN); pause(); exit(0);
} } }
(1)运行结果:
else
}
signal(SIGINT,IntDelete);
waitpid(-1,&exitcode,0); /*等待任何子进程中断或结束*/ printf(“parent process is killed \\n”); exit(0);
{
18
(3)分析原因:
signal(SIGQUIT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)分别为忽略键入信号和忽略中断信号。在子进程中开始添加signal(SIGQUIT,SIG_IGN)时,子进程会忽略键盘软中断信号,此时按Ctrl+C不会将子进程终止,程序仍正常运行,而在子进程中开始添加signal(SIGQUIT,SIG_IGN)时,相应的中断信号会被忽略。
二、流程图 开始 初始化中断信号集 创建子进程1 否 否 否 否 子进程 2等待软中断信号17发生 得到软中断 信号12发生? 是 子进程1创建是否成功? 是 否 当前运行是否为父进程? 是 创建子进程2 子进程2创建是否成功? 子进程1等待软中是 当前运行是否为父进程? 是 等待软中断发生 得到软中断信过了5秒? 是 接受等软中断SIGIN 产生软中断SIQALRM 是 号10发生? 否 断信号10发生 软中断信号12 子进程2终止 调用kill( )向两个19 子进程发出中断信软中断信号10 子进程1结束 等待子进程1终止
三、实验总结
通过本次实验,我加深了对进程间通信这部分知识的认识。在实验过程中,我知道了怎样使用kill()和signal()两个系统调用实现了软中断,其中signal( )预置对信号的处理方式,允许调用进程控制软中断信号,并了解到wait_mark的作用,waitpid( )会暂停目前进程的执行,直到有信号来到或子进程结束,exit( )终止进程的执行。同时,我也知道了进程在前台和后台间切换和向后台进程发送信号的方法。但由于带较多的新接触的系统调用,导致一些程序读起来有一点困难,在阅读该程序过程中,我感觉应当要注意程序的运行顺序,只有理解程序是如何运行的,才能真正掌握进程通信的本质。
(三)进程的管道通信实验
【实验目的】
1.了解什么是管道
2.熟悉UNIX/LINUX支持的管道通信方式
【报告内容】
一、进程的管道通信
1.编制一段程序,实现进程的管道通信。使用pipe()建立一条管道线。两个子进程pid1和pid2分别向管道各写一句话: Child 1 is sending message! Child 2 is sending message!
而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。
20
2)服务器发送应答
HTTP/version status-code status-message 附加信息 空行 内容
协议的完整描述可以参阅网上的版本1.0的RFC1945和版本1.1的RFC2068。
Web服务器必须接受客户的HTTP请求,并发送HTTP应答。请求和应答采用纯文本格式,是为了便于使用C中的输入/输出以及字符串函数读取和处理。
编写Web服务器: 要求Web服务器只支持GET命令,只接收请求行,跳过其余参数,然后处理请求和发送应答,主要循环如下: while(1){ fd=accept(sock, NULL, NULL); fpin=fdopen(fd,‖r‖); fgets(fpin, request, LEN); read_until_crnl(fpin); process_rq(request, fd); fclose(fpin); }
为了简洁,这里忽略了出错检查。
(1)处理请求
处理请求包含识别命令和根据参数进行处理: process_rq( char *rq, int fd ) { char cmd[BUFSIZ], arg[BUFSIZ]; /* create a new process and return if not the child */ if ( fork() != 0 ) return; strcpy(arg, \ /* precede args with ./ */ if ( sscanf(rq, \ return; if ( strcmp(cmd,\ cannot_do(fd); else if ( not_exist( arg ) ) do_404(arg, fd ); else if ( isadir( arg ) ) do_ls( arg, fd ); else if ( ends_in_cgi( arg ) )
36
do_exec( arg, fd ); else do_cat( arg, fd ); } 服务器为每个请求创建一个新的进程来处理。子进程将请求分割成命令和参数。如果命令不是GET,服务器应答HTTP返回码表示未实现的命令。如果命令是GET,服务器将期望得到一个目录名,一个以 .cgi 结尾的可执行程序或文件名。如果没有该目录或指定的文件名,服务器报错。 如果存在目录或文件,服务器决定所要使用的操作:ls、exec或cat。 (2)目录列表函数
函数do_ls处理列出目录信息的请求: do_ls(char *dir, int fd) { FILE *fp ; fp = fdopen(fd,\ header(fp, \ fprintf(fp,\ fflush(fp); dup2(fd,1); dup2(fd,2); close(fd); execlp(\ perror(dir); exit(1); } 这里没有使用popen,而是通过调用ls命令,避免用户向shell popen传递任意字符串来运行的问题。 Webserv的源程序
main(int ac, char *av[]) { int sock, fd; FILE *fpin; char request[BUFSIZ]; if ( ac == 1 ){ fprintf(stderr,\ exit(1); } sock = make_server_socket( atoi(av[1]) ); if ( sock == -1 ) exit(2);
37
/* main loop here */ while(1){ /* take a call and buffer it */ fd = accept( sock, NULL, NULL ); fpin = fdopen(fd, \ /* read request */ fgets(request,BUFSIZ,fpin); printf(\ read_til_crnl(fpin); /* do what client asks */ process_rq(request, fd); fclose(fpin); } }
运行Web服务器:
编译程序,并在某个端口(建议用80)运行它: $cc webserv.c socklib.c –o webserv $./webserv 80
现在可以访问Web服务器,网址为http://yourhostname/。将html文件放到该目录中并用http://yourhostname/filename.html来打开它。创建下面的shell脚本: #!/bin/sh
printf ―Content-type: text/plain\\n\\nhello\\n‖;
将它命名为hello.cgi,用chmod改变权限为755,然后用浏览器调用该程序:http://yourhostname/hello.cgi。
评价表格 考核标准 (1)正确理解和掌握实验所涉及的概念和原理(20%); (2)按实验要求合理设计数据结构和程序结构(20%); (3)能设计测试用例,运行结果正确(20%); (4)认真记录实验数据,原理及实验结果分析准确(20%); 得分 (5)实验过程中,具有严谨的学习态度和认真、踏实、一丝不苟的科学作风(5%); (6)所做实验具有一定的创新性(5%); (7)实验报告规范(10%)。 38
39
(1) 使用vi命令编写程序pipe0.c: main() {
int fd[2];
char OutPipe[100],InPipe[100]; pipe(fd);
while((pid1=fork())== -1); if(pid1= =0) {
lockf(fd[1],1,0);
sprintf(OutPipe,“child 1 is sending message!”); /*把串放入数组outpipe中*/
write(fd[1],OutPipe,50); /*把串放入数组outpipe中*/ sleep(5); /*自我阻塞5秒*/ lockf(fd[1],0,0); exit(0); } else {
while((pid2=fork())== -1); if(pid2==0) {
lockf(fd[1],1,0); /*互斥*/ sprintf(OutPipe,“child 2 is sending message!”); write(fd[1],OutPipe,50); sleep(5); lockf(fd[1],0,0); exit(0); } else {
wait(0); /*同步*/
read(fd[0],InPipe,50); /*从管道中读长为50字节的串*/ printf(“%s\\n”,InPipe); wait(0); } } }
(2)运行结果:
21
在显示结果时:
child 2 is sending message!(延迟5秒后显示) child 1 is sending message!(再延迟5秒) (3)分析原因:
本实验利用函数pipe()建立通信管道,两个子进程分别向管道写入信号,父进程读取管道信号在显示,管道的写入操作分别加锁实现互斥操作。子进程1先建立,所以第一次读取的管道信号是子进程发来的,等待子进程1终止后再从管道读取信号,此时的信号是子进程2发来的。由于管道通信的互斥、同步等通信机制,执行结果不会再出现随机性。 2.在父进程中用pipe()建立一条管道线,往管道里写一句话,两个子进程接收这句话。 (1) 使用vi命令编写程序pipe1.c: main() {
int fd[2];
char OutPipe[100],InPipe[100]; pipe(fd);
while((pid1=fork())==-1); if(pid1==0)
{ sleep(2);
lockf(fd[0],1,0); read(fd[0],InPipe,50);
printf(\ printf(\
lockf(fd[0],0,0); exit(0); } else {
while((pid2=fork())==-1); if(pid2==0 ) { sleep(2); lockf(fd[0],1,0); read(fd[0],InPipe,50);
printf(\ printf(\
22
lockf(fd[0],0,0); exit(0); } else {
lockf(fd[1],1,0);
sprintf(OutPipe,\ write(fd[1],OutPipe,50); lockf(fd[1],0,0); sleep(5); wait(); sleep(5);
wait(); exit(0); } } }
(2)运行结果:
(3)分析原因:
本实验利用函数pipe()在父进程中建立通信管道,两个子进程分别接收来自父进程的写入信号。子进程1先建立,所以第一次读取的管道信号是子进程发来的,等待子进程1终止后再从管道读取信号,此时的信号是子进程2发来的。
二、流程图
开始 初始化变量 创建子进程pid1 否 子进程pid1创建是否成功? 是 当前是父进程? 否 创建子进程pid2 否 23 子进程pid2创建是否成功? 是 写入管道打印
三、实验总结
本次实验在编写程序pipe.c时,利用函数pipe()建立通信管道,两个子进程分别向管道写入信号,父进程读取管道信号在终端显示。在编写程序pipe1.c时,利用函数pipe()在父进程中建立通信管道,两个子进程分别接收来自父进程的写入信号。按照实验要求,发现两次的调试结果居然一样。我总结出此次实验主要是利用函数pipe()建立通信管道,子进程或父进程从通信管道读取信号然后在终端显示出来。
(四)消息的发送与接收实验
【实验目的】
1.了解什么是消息。 2.熟悉消息传送机理。 3.编程实现消息的发送与接收。
【实验内容】
一、消息的发送与接收
1.消息的创建、发送和接收。使用系统调用msgget( ),msgsnd( ),msgrev( ),及msgctl( )编制一长度为1k的消息发送和接收的程序。 (1) 使用vi命令编写程序client.c和server.c: ①client.c
void client()
24
{
int i;
msgqid=msgget(MSGKEY,0777); /*打开75#消息队列*/ for(i=10;i>=1;i--) {
msg.mtype=i;
printf(“(client)sent\\n”);
msgsnd(msgqid,&msg,1024,0); /*发送消息msg入msgid消息队列*/ } exit(0); } main( ) {
client( ); }
②server.c void server( ) {
+msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*消息队列*/ do {
msgrcv(msgqid,&msg,1030,0,0); /* printf(“(server)received\\n”); }
while(msg.mtype!=1); /* msgctl(msgqid,IPC_RMID,0); /* exit(0); } main( ) { server( ); }
(2)运行结果:
25 创建75#消息队列,由关键字获得从队列msgid接受消息msg*/ 消息类型为1时,释放队列*/ 删除消息队列,归还资源*/
(3)分析原因:
按理来说,执行结果应该是“(client)sent”和“(server)received”的字样在屏幕上交替出现。然而实际结果是,先由 client 发送十条消息,然后server接收十条消息。此后client和server交替发送和接收消息, 因此client 和server 分别发送和接收了10条消息,与预期设想一致,如运行结果(2)所示。
二、程序设计思路和方法
(1)编写程序client.c和server.c作为“引子”,先后使用系统调用fork()两个子进程server和client进行通信。
(2)client端使用KEY为75的消息队列,先后发送类型从10到1的消息后退出。最后的一个消息即是server端需要的结束信号。client每发送一条消息后显示一句“(client)sent”。 (3)server端建立一个KEY为75的消息队列,等待其他进程发来的消息。当遇到类型为1的消息时,则作为结束信号,取消该队列并退出server。server每接收到一个消息后显示一句“( server) received”。
(4)父进程在server和client均退出后结束。
26
三、实验总结
在消息的发送与接收的实验过程中,使用msgget()方法可以创建一个消息,获得一个消息的描述符;msgsnd()方法向指定的消息队列发送一个消息,并将该消息链接到该消息队列的尾部等。在编写程序client.c和server.c时,应用到了此类方法。在调试过程中,client发送一句消息同时在终端显示(client)sent,server就接收该消息并在终端显示( server) received,此后client和server交替发送和接收消息,最后server一次接收两条消息。虽然在实验过程中,部分代码难懂,对于功能分析造成困扰,但整体还不错,总算把消息的发送与接收这个实验做完了。
实验四编写Web服务器
【实验目的】
通过编写一个比较实用的Web服务器程序,消除学生对Web服务程序的神秘感和恐惧心理,增强学生的信心。在这个过程中,可以使学生熟练掌握socket编程,以及调试技巧。由于Web服务器要使用多进程(或多线程),让学生对进程有更深入的理解。让学生了解HTTP协议,消除其神秘感。
【报告内容】
1.服务器设计重点
基于socket的客户/服务器系统大多是类似的。一旦理解了一个socket流的客户/服务器系统,就可以理解大多数其他的系统。
2.三个主要操作
客户和服务器都是进程。服务器设立服务,然后进入循环接收和处理请求。客户连接到服务器,然后发送、接受或者交换数据,最后退出。该交互过程中主要包含了一下三个操作: (1)服务器设立服务 (2)客户连接到服务器 (3)服务器和客户处理事务
27
客户: 服务器:
建立服务 连接到服务器 接收请求 获取服务 提供服务 挂断连接 挂断连接
3.连接过程
操作1:建立服务器端socket
设立一个服务一般需要如下3个步骤: (1)创建一个 socket
socket = socket ( PF_INET, SOCK_STREAM, 0 ) (2)给 socket 绑定一个地址 bind ( sock, &addr, sizeof(addr) ) (3)监听接入请求 listen ( sock, queue_size )
步骤1:
创建一个服务器端socket
为了避免在编写服务器时重复输入上述代码,将这3个步骤组合成一个函数:make_server_socket。在编写服务器的时候,只需调用该函数就可以创建一个服务端socket。具体如下:
sock=make_server_socket(int portnum)
return -1 if error, or a server socket listening at port ―portnum‖
28
操作2:建立到服务器的连接
基于流的网络客户连接到服务器包含以下两个步骤: (1)创建一个 socket
socket = socket ( PF_INET, SOCK_STREAM, 0 ) (2)使用该 socket 连接到服务器
connect ( sock, &serv_addr, sizeof ( serv_addr ) )
步骤2:
创建并连接客户socket到服务器
将这两个步骤抽象成一个函数:connet_to_server。当编写客户端程序时,只要调用该函数就可以建立到服务器的连接。具体如下: fd=connet_to_server(hostname, portnum) return -1 if error,
or a fd open for reading and writing connected to the socket at port ―portnum‖ on host ―hostname‖ /*
* socklib.c *
* This file contains functions used lots when writing internet * client/server programs. The two main functions here are: *
* make_server_socket( portnum ) returns a server socket * or -1 if error
* make_server_socket_q(portnum,backlog) *
* connect_to_server(char *hostname, int portnum) * returns a connected socket * or -1 if error */
socklib.c
#include
29
#include
#define HOSTLEN 256 #define BACKLOG 1
int make_server_socket_q(int , int );
int make_server_socket(int portnum) { return make_server_socket_q(portnum, BACKLOG); }
int make_server_socket_q(int portnum, int backlog) { struct sockaddr_in saddr; /* build our address here */ struct hostent *hp; /* this is part of our */ char hostname[HOSTLEN]; /* address */ int sock_id; /* the socket */ sock_id = socket(PF_INET, SOCK_STREAM, 0); /* get a socket */ if ( sock_id == -1 ) return -1; /** build address and bind it to socket **/ bzero((void *)&saddr, sizeof(saddr)); /* clear out struct */ gethostname(hostname, HOSTLEN); /* where am I ? */ hp = gethostbyname(hostname); /* get info about host */ /* fill in host part */ bcopy( (void *)hp->h_addr, (void *)&saddr.sin_addr, hp->h_length); saddr.sin_port = htons(portnum); /* fill in socket port */ saddr.sin_family = AF_INET ; /* fill in addr family */ if ( bind(sock_id, (struct sockaddr *)&saddr, sizeof(saddr)) != 0 ) return -1; /** arrange for incoming calls **/ if ( listen(sock_id, backlog) != 0 ) return -1; return sock_id; }
int connect_to_server(char *host, int portnum) {
30
正在阅读:
linux实验报告09-30
样板引路方案最终版 - 图文10-20
中考复习方案(北京专版)2019中考数学 专题突破一 填空压轴题型04-19
(部选)JAVA各章习题及答案01-17
12篇学习习近平总书记在新疆考察时的重要讲话精神心得体会研讨发03-31
春节写作文400字【优秀4篇】03-22
合同法案例分析及解析05-23
20世纪俄罗斯文学11-24
冬季施工方案 - secret05-03
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 实验
- 报告
- linux
- 班级文化建设结题报告
- 印帝圣茶教你判断你是属于那种肾虚
- 第五章固定资产习题
- 江苏省句容市行香中学八年级语文上册第3课老山界第1课时教学案无答案新版苏教版
- 桥牌提高战略
- 江苏省南京市2019年中考英语模拟试卷精选汇编:任务型阅读专题
- 诵读
- 李克月《清兵卫与葫芦》导学案
- 天津市新华中学2012届高三上学期第二次月考地理试题
- 110kV变电所继电保护设计及分析最详细
- 实验三 单级低频放大电路(2013改)
- 场论典型例题
- 中共泰州市海陵区委组织部
- Three keys to a happy life
- 外源基因在宿主细胞中的表达1
- 物理学的进步对社会发展的贡献 - 图文
- 山丹题壁(诗歌赏析)
- 国际投资学第4-5章
- 参考模板2:重庆邮电大学-预备党员教育考察登记簿
- 部编人教版九年级历史上册精品教案(全册) - 图文