资源描述:
《《Linux操作系统设计实践》实验一进程管理》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、《Linux操作系统设计实践》实验一:进程管理实验目的:(1)加深对进程概念的理解,明确进程和程序的区别。(2)进一步认识并发执行的实质。(3)学习通过进程执行新的目标程序的方法。(4)了解Linux系统中进程信号处理的基本原理实验环境:红帽操作系统实验内容:1.进程的创建fork()。2.使用exec函数族使子进程执行新的目标程序。3.编写一段程序,使其实现进程的软中断通信实验代码的验证:1.编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符
2、“a”:子进程分别显示“b”和“c”。试观察记录屏幕上显示结果,并分析原因。#includeintmain(){intp1,p2;while((p1=fork())==-1);if(p1==0){putchar('b');printf(“”);}else{while((p2=fork())==-1);if(p2==0){putchar('c');printf(“”);}else{putchar('a');printf(“”);}return0;}实验结果:如上所示:a,b,c出现的顺序是是不固定的。分析:fork()会
3、产生一个新的子进程。如果fork成功则在父进程会返回新建立的子进程标识好(PID),而子进程会返回0;如果fork()失败则是返回-1.fork()是一个返回两个参数数的函数,如果fork()返回值大于0时,代表创建fork()函数的下一句是由父进程执行的。如果返回值为0时,代表创建fork()函数的下一句是由子进程执行的。因此,上诉程序会形成三个进程:父进程打印字符a,子进程1打印字符b,子进程2打印字符c。由并发程序运行,可知这三个进程运行的顺序是不固定的。2.使用exec函数族使子进程执行新的目标程序。#include#in
4、cludeintmain(){char*argv[]={"ls","-a","/home/s030802214/test",(char*)0};execv("/bin/ls",argv);return0;}实验结果:分析:execv()函数的原型:intexecv(constcher*path,char*constargv[]);其中一个参数指定执行文件所代表的路径,第二个参数利用数组指针来传递给执行文件。所以上诉程序的效果与输入shell命令:ls-a的结果是一样的。3.使用系统调用fork()创建两个子程序,再用系统调用si
5、gnal()接收父进程从键盘上来的中断信号(即按Ctrl+c键);当有中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程有信号后分别输出ChildProcessllisKilledbyParent!ChildProcessl2isKilledbyParent!父进程等待两个子进程终止后,输出如下的信息后终止:ParentprocessisKilled!============================#include#includeintwait_mark;voidwaiting(){w
6、hile(wait_mark==1);}voidstop(){wait_mark=0;}intmain(){intp1,p2;while((p1=fork())==-1);if(p1==0){wait_mark=1;signal(SIGINT,SIG_IGN);signal(16,stop);waiting();printf("ChildProcess11isKilledbyParent!");exit(0);}else{while((p2=fork())==-1);if(p2==0){wait_mark=1;signal(SIGINT,SIG
7、_IGN);signal(17,stop);waiting();printf("ChildProcess12isKilledbyParent!");exit(0);}else{wait_mark=1;signal(SIGINT,stop);waiting();kill(p1,16);kill(p2,17);wait(0);wait(0);printf("ParentProcessisKilled!");exit(0);}}}实验结果:分析:上述程序中子进程1.和子进程2都有signal(SIGINT,SIG_IGN),的系统调用,故当键盘按
8、下Ctrl+c键时这两进程不会响应。这两个子进程一开始都有waiting()故这两个进程就相当与阻塞了,当CPU运行到父进