操作系统进程实验报告
发布时间:2020-09-22 12:32:57 来源: 自查报告 点击:
PAGE
PAGE #
武汉工程大学实验报告
专业班级:
姓名:
学号:
课程名称:操作系统
实验成绩: 指导教师: :
实验名称:进程控制与进程间通信
一、 实验目的:
1、 掌握进程的概念,明确进程和程序的区别。
2、 认识和了解并发执行的实质。
3、 了解什么是信号。
4、 熟悉LINUX系统中进程之间软中断通信的基本原理。
二、 实验内容:
1、进程的创建
编写一段程序,使用系统调用 fork()创建两个子进程,在系统中有一个父进程和两个子
进程活动。让每个进程在屏幕上显示一个字符; 父进程显示字符“a”,子进程分别显示字符 “b”
和“ c”。试观察记录屏幕上的显示结果,并分析原因。
<参考程序>
# in clude<stdio.h>
main ()
{ int p1, p2;
while((p 1= fork())= = -1);
if(p1= =0)
putchar( ‘ b');
else
{ while((p2=fork())= =-1); if(p2= =0) putchar( ‘c');
else
putchar( ‘a');
}
} 2、修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行时屏幕上 出现的现象,并分析其原因。
<参考程序>
# in clude<stdio.h> main ()
{ int p1, p2, i;
while((p 1= fork())= = -1);
if(p1= =0) for(i=0;i<500;i++) prin tf( “ child%d n”,i) ;
else
{ while((p2=fork())= =-1);
If(p2= =0) for(i=0;i<500;i++)
printf( “ son%d n” ,i) ;
else for(i=0;i<500;i++) printf( “ daughter%d n” ,i) ;
}
}
3、编写一段程序, 使用系统调用 fork( )创建两个子进程,再用系统调用 signal( ) 让父进 程 捕捉键盘上来的中断信号 (即按 ctrl+c 键),当捕捉到中断信号后, 父进程用系统调用 kill( ) 向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:
Child process 1 is killed by parent!
Child process 2 is killed by parent! 父进程等待两个子进程终止后,输出以下信息后终止: Parent process is killed!
<参考程序 >
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h> #include<sys/wait.h> int wait_mark;
void waiting(),stop();
void main()
{int p1, p2; signal(SIGINT,stop);
while((p1=fork())==-1);
if(p1>0) /* 在父进程中 */
{① while((p2=fork())==-1);
If(p2>0) /* 在父进程中 */ { ②
wait_mark=1; waiting(0); kill(p1,10); kill(p2,12); wait( );
wait( );
printf("parent process is killed!\n");
exit(0);
} else /* 在子进程 2 中 */
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 /* 在子进程 1 中*/
{
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);
}
}
void waiting()
{
while(wait_mark!=0);
}
void stop()
{
wait_mark=0;
}
三、实验要求
运行程序并分析结果。
四、实验结果及分析
第一题:
代码
1 #includ亡丈stdio?h>_ main(){456
1 #includ亡丈stdio?h>
_ main()
{
4
5
6
7
B
9
10
11
12
13
14
15
}
int pbp2;
while{ {pl=fork ()}=-】); if(pl==G)
putchar('b1);
h I e( (p2=fork(} )=1);
1J(p2==?)
piitchar{ 'c');
&lse
putchar(ba1);
运行结果
a boot dull etc hp lost+tound mnt proc
bin dev duli.c home lib media opt root
[root@localhost /]# gicc dull.c *o dull
[rootglocalhost /I# vi dull.c
[root@localhost /]# ./dull
bca[ root(alocalhost /]# JMIuli
bca[root@localhost /]# ?/duli bca[root@localhost /]# vi duli.c f rootOlocalhost /l# I
sbin selinux
sys usr
var
分析:
首先判断子进程是否创建好,如果创建好则返回
0,首先输出b,以此类推然后再输出 c,a
所以最后结果为bca。
第二题
代码
main(}
I
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 H
int pl,p2,i;
ill ((pl=fork(})=-1);
i (p 1=G)
(i=s;i<5SG;i++) printf(uchild^d\n",i): else
{
■. ill - (fp2=fork() ) = -l);
i f (p2=Q)
-:i (i=0;i<500;i++} printf("son%d\n"*i);
已15 E
fo (i=Q;i<50G;i++}
printf ("daughter d\n\i);
■■dierti.c" 19L. 282C 运行结果
son499
son491
son492
son493 son斗94 san495 son496 son497
son49S
son499
daughters daughterl daughter2 daughte「3 daughter4 daughter^ daughte r6 daughter?
daughters daughte r9 daughterly daughterll daughterl2 daughterly
分析:
19.
首先判断子进程是否判断好。然后进入一个 for循环语句,i的值从0 —直到
499依次输出。
F面的结果依次类推。
第三题
代码:
gjinclude<stdio + h>
# iiKludEcignml 山》
#include<unistd.h>
#include<sys/types? h》 #include<5y5/wait + h> int waitmark;
void waiting()*stop{);
int main()
{
int plrp2;
signal(SIGINT^stop);
it ((pl=fork())==-l};
i^(pi>e)
{
((p2=fork())==-l); (p2>e)
{
wait_mark=l; waiting(B);
kill(pl,10}; kiU(p2F12}; wait(Q); wait(Q); printfj"parent process is killed!\nH);
}
else { wait_mark=l; signalt12fstop); waiting]); lockf(1,lf0); printf("child process 2 is killed by parentl\n"}; lockf(iret0);
else
{
wait mark=l;
运行结果:
disanti.匚:25:警告:隐式声明与內建函数'exit'不兼容 disanti.c:35:警告:隠式声明与内建函数七耳it'不兼容 disanti.c:^:警告:隐式声明与内建函数'exit'不兼容 [rootglocalhost /]# vi disanti.c [rootQlocalhost /]# gcc disanti.匚-o disanti disanti,c:在函数'mailrT中: dissnti.c:25:警告:隠式声明与内建函数fexit*不蒸容 disanti,c:35:警吿:廨式声明与内建函不兼容 disanti.c:46:警告:隠式声明与内建函数「exit'不蕪容 [root@localhost /]# vi disanti.c
[root(aioc3lhost /]# gcc disanti.c -o disanti disanti.c:在函数'mainr中: disanti. c: 34:警告:隐式声明与内建函数Jexitf不兼容 disanti.c:45:警告:隐式芦明与内建函数飞xit"不慕容
[root@localhost [roottalo 匚
[root@localhost [roottalo 匚 alhos t [rootglocalhost ACchild process child process 1
/]# gcc disanti*匚-o disanti
/]# ./disanti
2 is killed by parent! is killed by parent!
parent process is killed! [root@localho5t /]#
分析: 使用系统调用fork()创建两个子进程,再用系统调用 signal()让父进程捕捉键盘上来的中断
信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用 kill() 向两个子进程发出
信号,子进程捕捉到信号后,最后输出结果。
【思考题】
1、 系统是怎样创建进程的?
答:linux 系统创建进程都是用 fork()系统调用创建子进程由 fork()系统调用创建的新 进程被称为子进程。该函数被调用一次,但返回两次。如果 fork()进程调用成功,两次返
回的区别是子进程的返回值是 0,而父进程的返回值则是新子进程的进程号。
2、 当首次调用新创建进程时,其入口在哪里?
答:窗口、任务管理器里面的 "新建任务”,然,也可以去dos里面。
3、 当前运行的程序(主进程)的父进程是什么?
答:创建该进程的进程的进程,或是 init进程。
实验总结
经过这次实验我了解了 linux 系统一些常识, vi 编译器的基本命令, 同时也了 解了一些 linux 代码的结构和语法,在调试代码的过程中也学到了很多改错的经验 和技巧,尤其是要淡定的修改代码错误。
相关热词搜索:实验报告 进程 操作系统 实验 操作系统进程实验报告
热点文章阅读