操作系统进程实验报告

发布时间: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 代码的结构和语法,在调试代码的过程中也学到了很多改错的经验 和技巧,尤其是要淡定的修改代码错误。

相关热词搜索:实验报告 进程 操作系统 实验 操作系统进程实验报告

版权所有 静静文本网 www.lxzcp.com