内蒙古工业大学信息工程学院
实 验 报 告
课程名称: 操作系统 实验名称: 进程管理 实验类型: 验证性□ 综合性□ 设计性□ 实验室名称: 班级: 学号:
姓名: 组别:
同组人: 成绩: 实验日期: 2011年12月
实验一 进程管理
一、实验目的
1.学会在Linux中利用系统调用fork()创建进程。 2.加深对进程概念的理解,明确进程和程序的区别。 3.进一步认识在系统内进程并发执行的实质。
4.分析进程竞争资源的现象,学习解决进程互斥的方法。 5.掌握Linux中进程通信的基本原理。
二、实验类型
验证性实验。
三、实验预备知识
1.阅读Linux的sched.h源码文件,加深对进程管理概念的理解。 2.阅读Linux的fork.c源码文件,分析进程的创建过程。
四、实验内容
1.进程的创建 【任务】
编写一段程序,使用系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。
【程序】 #include
int p1,p2;
while((p1=fork())= =-1); /*创建子进程p1,失败时循环*/ if(p1= =0) /*子进程p1创建成功*/ putchar(?b?);
else /*父进程返回*/ {
- 1 -
while((p2=fork())= =-1); /*创建另一个子进程p2,失败时循环*/ if(p2= =0) /*子进程p2创建成功*/ putchar(?c?); else
putchar(?a?); /*父进程执行*/ } }
【执行结果】
2.进程的控制 【任务】
修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其原因。如果在程序中使用系统调用lockf()来给每个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。
【程序1】 #include
- 2 -
int p1,p2,i;
while((p1=fork())= =-1); if(p1= =0)
for(i=0;i<50;i++) printf(“child %d\\n”,i); else
{
while((p2=fork())= =-1) if(p2= =0)
for(i=0;i<50;i++) printf(“son %d\\n”,i); else
for(i=0;i<50;i++)
printf(“daughter %d\\n”,i); } }
【执行结果】
- 3 -
【程序2】 #include
int p1,p2,i;
while((p1=fork())= =-1); if(p1= =0) {
lockf(1,1,0); /*加锁*/ for(i=0;i<50;i++) printf(“child %d\\n”,i); lockf(1,0,0); /*解锁*/ } else
{
while((p2=fork())= =-1) if(p2= =0) {
lockf(1,1,0); for(i=0;i<50;i++) printf(“son %d\\n”,i); lockf(1,0,0); } else {
lockf(1,1,0); for(i=0;i<50;i++)
printf(“daughter %d\\n”,i); lockf(1,0,0); }
- 4 -
} }
【执行结果】
3.软中断通信 【任务1】
编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按Ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止: child process 1 is killed by parent! child process 2 is killed by parent!
父进程等待两个子进程终止后,输出以下信息后终止: parent process is killed! 【程序】
#include
- 5 -
void waiting(),stop(); int wait_mark; main() {
int p1,p2;
while((p1=fork())= =-1); /*创建进程p1*/ if(p1>0) {
while((p2=fork())= =-1); /*创建进程p2*/ if(p2>0)
{
Printf(“parent run!\\n”); Printf(“p1=%d\\n”,p1); Printf(“p2=%d\\n”,p2); wait_mark=1;
getchar();
kill(p1,16); /*向p1发软中断信号16*/ kill(p1,17); /*向p2发软中断信号17*/ sleep(5); /*父进程睡眠5秒*/ wait(0); /*等待子进程结束,同步*/ wait(0); /*等待另一子进程结束,同步*/ lockf(stdout,1,0); /*标准输出加锁*/ printf(“parent process is killed!\\n”);
lockf(stdout,0,0); /*标准输出解锁*/ exit(0); /*父进程终止*/ }
else {
printf(“p2 run!\\n”);
- 6 -
wait_mark=1;
signal(17,stop); /*接收父进程发来的软中断信号17,并转stop*/ waiting();
lockf(stdout,1,0); /*标准输出加锁*/ printf(“child process 2 is killed by parent!\\n”); lockf(stdout,0,0); /*标准输出解锁*/ exit(0); /*子进程p2终止*/
} } else {
printf(“p1 run!\\n”);
wait_mark=1;
signal(16,stop); /*接收父进程发来的软中断信号16,并转stop*/ waiting();
lockf(stdout,1,0); /*标准输出加锁*/ printf(“child process 1 is killed by parent!\\n”); lockf(stdout,0,0); /*标准输出解锁*/ exit(0); /*子进程p1终止*/
} }
void waiting() {
printf(“waiting begin!\\n”); while(wait_mark!=0); printf(“waiting end!\\n”); } void stop() {
wait_mark=0; printf(“signal stop!”);
- 7 -
}
【执行结果】
【任务2】
在上面任务1中,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。这里signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)分别为忽略“Ctrl+c”键信号以及忽略中断信号。 【程序】
#include
int pid1,pid2;
int endflag=0,pf1=0,pf2=0;
void intdelete() {
- 8 -
kill(pid1,16); kill(pid2,17); endflag=1; } void int1() {
printf(“child process 1 is killed by parent!”); exit(0); } void int2() {
printf(“child process 2 is killed by parent!”); exit(0); }
main() {
int exitpid;
signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN); while((pid1=fork())= =-1); if(pid1= =0) {
printf(“process 1 run!\\n”); signal(SIGUSR1,int1); signal(16, SIG_IGN); pause(); exit(0); } else {
- 9 -
while((pid2=fork())= =-1); if(pid2= =0) {
printf(“process 2 run!\\n”); signal(SIGUSR2,int2); signal(17, SIG_IGN); pause(); exit(0); } else {
printf(“parent run!\\n”); signal(SIGINT,intdelete); waitpid(-1,&exitpid,0);
printf(“parent process is killed!\\n”); exit(0); } } }
【执行结果】
4.进程的管道通信 【任务】
编制一段程序,实现进程的管道通信。使用系统调用pipe()建立一条管道线。两个子进
- 10 -
程p1和p2分别向管道各写一句话: child 1 is sending a message! child 2 is sending a message!
而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。 【程序】
#include
int pid1,pid2; main() {
int fd[3];
char outpipe[100],inpipe[100]; pipe(fd);
while((pid1=fork())= =-1); if(pid1= =0) {
printf(“p1 run!\\n”); lockf(fd[1],1,0);
sprintf(outpipe,”child 1 process is sending a message!”); write(fd[1],outpipe,50); sleep(1); lockf(fd[1],0,0); exit(0); } else
{
while((pid2=fork())= =-1); if(pid2= =0)
- 11 -
{
printf(“p2 run!\\n”); lockf(fd[1],1,0);
sprintf(outpipe,”child 2 process is sending a message!”); write(fd[1],outpipe,50); sleep(1); lockf(fd[1],0,0); exit(0);
} else {
printf(“parent run!\\n”); wait(0);
read(fd[0],inpipe,50); printf(“%s\\n”,inpipe); wait(0);
read(fd[0],inpipe,50); printf(“%s\\n”,inpipe); exit(0); } } }
- 12 -
操作系统进程管理课程设计



