预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

《Linux操作系统设计实践》实验一:进程管理 实验目的: (1)加深对进程概念的理解,明确进程和程序的区别。 (2)进一步认识并发执行的实质。 (3)学习通过进程执行新的目标程序的方法。 (4)了解Linux系统中进程信号处理的基本原理。 实验环境:RedHatLinux 实验内容:(1)进程的创建 编写一段程序,使用系统调用fork()创建两个子进程,当此进程运行时,在系统中有一个父进程和两个子进程活动,让每一个进程在屏幕上显示一个字符,父进程显示字符“a”;子进程分别显示字符“b”和字符“c”,试观察记录屏幕上的显示结果,并分析原因。 程序代码: #include<stdio.h> intmain() { intp1,p2; while((p1=fork())==-1); if(p1==0) putchar('b'); else { while((p2=fork())==-1); if(p2==0) putchar('c'); else putchar('a'); } return0; } 运行结果:bca 分析:第一个while里调用fork()函数一次,返回两次。子进程P1得到的返回值是0,父进程得到的返回值是新子进程的进程ID(正整数);接下来父进程和子进程P1两个分支运行,判断P1==0,子进程P1符合条件,输出“b”;接下来else里面的while里再调用fork()函数一次,子进程P2得到的返回值是0,父进程得到的返回值是新子进程的进程ID(正整数);接下来判断P2==0,子进程P2符合条件,输出“c”,接下来父进程输出“a”,程序结束。 (2)进程的控制 ①修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。 程序代码: #include<stdio.h> intmain() { intp1,p2; while((p1=fork())==-1); if(p1==0) printf("Child1isrunning!\n"); else { while((p2=fork())==-1); if(p2==0) printf("Child2isrunning!\n"); else printf("Fatherisrunning!\n"); } return0; } 运行结果:Child1isrunning! Child2isrunning! Fatherisrunning! 分析:本实验和上一个实验一样,只是将每个进程输出一个字符改为每个进程输出一句话。第一个while里调用fork()函数一次,返回两次。子进程P1得到的返回值是0,父进程得到的返回值是新子进程的进程ID(正整数);接下来父进程和子进程P1两个分支运行,判断P1==0,子进程P1符合条件,输出“Child1isrunning!”;接下来else里面的while里再调用fork()函数一次,子进程P2得到的返回值是0,父进程得到的返回值是新子进程的进程ID(正整数);接下来判断P2==0,子进程P2符合条件,输出“Child2isrunning!”,接下来父进程输出“Fatherisrunning!”,程序结束。 ②创建进程,使用exec函数族使子进程执行新的目标程序,观察并分析出现的现象。 程序代码: #include<stdio.h> #include<unistd.h> intmain() { printf("===systemcallexecltesting===\n"); execlp("date","date",0); printf("execerror!\n"); return0; } 运行结果:===systemcallexecltesting=== 五11月422:23:51CST2011 分析:创建了进程,使用exec函数族使子进程执行新的目标程序,输出结果为目标程序的输出。 (3)进程信号处理 编写程序使用系统调用fork()创建两个子进程,再用系统调用singal()让父进程捕捉键盘上来的中断信号(即按Ctrl+c键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: ChildProcess11isKilledbyParent! ChildProcess12isKilledbyParent! 父进程等待两个子进程终止后,输出如下的信息后终止: ParentProcessisKilled! 观察并分析出现的现象。 程序代码: #include<stdio.h> #include<signal.h> intwait_mark; voidwaiting() { while(wait_mark