操作系统实验一实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

相关文档
最新文档