操作系统实验一实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验一实验报告
基本信息
1.1 实验题目
进程控制实验
1.2完成人
王召德
1.3报告日期
2015-4-8
实验内容简要描述
2.1实验目标
加深对于进程并发执行概念的理解。实践并发进程的创建和控制方法。观察和
体验进程的动态特性。进一步理解进程生命期期间创建、变换、撤销状态变换的过
程。掌握进程控制的方法,了解父子进程间的控制和协作关系。练习Linux 系统中
进程创建与控制有关的系统调用的编程和调试技术。
2.2实验要求
参考以上示例程序中建立并发进程的方法,编写一个多进程并发执行程序。父进程首先创建一个执行ls命令的子进程然后再创建一个执行ps命令的子进程,并控制ps 命令总在ls 命令之前执行。
2.3实验的软硬件环境
Ubuntu14.04 intelPC
报告的主要内容
3.1实验的思路
按照上面的实例,先生成一个子进程让其等待,然后生成第二个子进程,父进程等待其执行ps命令后唤醒第一个子进程执行ls即可。
3.2实验模型的描述
无
3.3主要数据结构的分析说明
无
3.4主要算法代码的分析说明
无
3.5项目管理文件的说明
无
实验过程和结果
4.1实验投入的实际学时数
1学时
4.2调试排错过程的记录
曾尝试让第二个子进程激活第一个子进程,结果发现当运行ps后,后面的代码将不再执行,所以不可行。
4.3多种方式测试结果的记录
实验结果:
父进程启动 (12239)
ls子进程启动 (12240)
ps子进程启动 (12241)
PID TTY TIME CMD
12239 pts/27 00:00:00 born
12240 pts/27 00:00:00 born
12241 pts/27 00:00:00 ps
ps子进程结束 (12241)
唤醒ls子进程 (12240)
键盘中断信号产生...
ls子进程被唤醒 (12240)
. born born.c~ hello.c pctl pctl.c~ pctl.o
.. born.c helelo.h~ hello.c~ pctl.c pctl.h
ls子进程结束 (12240)
父进程结束 (12239)
4.4实验结果的分析综合
无
实验的总结
父进程可以通过fork()函数生成子进程,子进程会从fork()函数开始执行原来的代码,当
子进程打开一个其他进程时,新进程便会代替此子进程,子进程后面的代码不会被执行。
进程的概念就是运行起来的程序,在实验中可以看出,同一段代码也可以变成几个不同的进程,但是归根结底他们也都是这一个程序运行得到的。进程并发其实就是分时的占用cpu得到执行。
子进程执行execve()函数可以执行新程序,新程序的进程号不变,替代原来的子进程运行,原来的子进程execve()函数后的代码便不再执行。
信号的产生就是一个中断,中断使cpu停止当前状态而去处理这个中断。可以通过给特定进程发送信号,使其从挂起状态重新启动,以达到控制目的。
附录
程序源代码
#include
#include
#include
#include
#include
#include
typedef void (*sighandler_t) (int);
void sigcat(){
printf("键盘中断信号产生...\n");
}
int main(int argc, char *argv[]){
signal(SIGINT,(sighandler_t)sigcat); //注册一个本进程处理键盘中断的函数int status_1,status_2;
char *args_1[] = {"/bin/ls","-a",NULL};
char *args_2[] = {"/bin/ps","-a",NULL};
int pid_1=fork() ; //建立子进程
if(pid_1<0) // 建立子进程1失败?
{
printf("Create 1th Process fail!\n");
exit(0);
}
if(pid_1 == 0) // 子进程1执行代码段
{
printf("ls子进程启动... %d\n",getpid());
pause(); //暂停,等待键盘中断信号唤醒
printf("ls子进程被唤醒... %d\n",getpid());
status_1 = execve(args_1[0],args_1,NULL);
exit(0);
}else{
printf("\n父进程启动... %d\n",getpid()); //报告父进程进程号
int pid_2 = fork();
waitpid(pid_2,&status_2,0); //等待ps子进程结束
if(status_2==0){
printf("ps子进程结束...%d\n",pid_2);
printf("唤醒ls子进程...%d\n",pid_1);
kill(pid_1,SIGINT);
waitpid(pid_1,&status_1,0); //等待ps子进程结束printf("ls子进程结束...%d\n",pid_1);
printf("父进程结束...%d\n",getpid());
exit(0);
}
if(pid_2<0) // 建立子进程2失败?
{
printf("Create 2th Process fail!\n");
exit(0);
}
if(pid_2 == 0) // 子进程2执行代码段
{
printf("ps子进程启动... %d\n",getpid());
status_2 = execve(args_2[0],args_2,NULL);
}
}
return 0;
}