.
操作系统实验一实验报告
基本信息 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
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[] = {\ char *args_2[] = {\ int pid_1=fork() ; //建立子进程 if(pid_1<0) // 建立子进程1失败? {
printf(\ exit(0); }
if(pid_1 == 0) // 子进程1执行代码段 {
printf(\子进程启动... %d\\n\ pause(); //暂停,等待键盘中断信号唤醒 printf(\子进程被唤醒... %d\\n\ status_1 = execve(args_1[0],args_1,NULL); exit(0); }else{
printf(\父进程启动... %d\\n\报告父进程进程号 int pid_2 = fork();
waitpid(pid_2,&status_2,0); //等待ps子进程结束
--