实验二

2017-05-02  本文已影响0人  空白_ce1f

西 安 邮 电 大学 (计算机学院)

操作系统课内实验报告

实验名称:进程

专业名称:计算机科学与技术

班 级:计科1503

学生姓名:魏新超

学号(8位):04151091

指导教师:陈莉君

实验日期:2017年4月13日

一. 实验目的及实验环境

通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX 规范中fork和kill系统调用的功能和使用
实验环境:deepin-15.3
二. 实验内容

  1. 你最初认为运行结果会怎么样?
    会按序号执行,当按q时退出
  2. 实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。
    实际结果与起初猜想不同,不是按顺序输出,而是随机输出的,每隔10秒输出10个进程,进程的执行是系统随机调度的。
  3. proc_number 这个全局变量在各个子进程里的值相同吗?为什么?
    不相同,proc_number在每个子进程中被修改,所以不相同。
  4. kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?
    调用次数按用户输入次数,没输入一次执行一次,每次执行完杀死一个进程,进程被杀死终结
  5. 使用kill 命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退出方式哪种更好一些?
    进程是用q退出的,主动退出好点,q退出杀死父进程,子进程被迫杀死,主动退出使用exit,能主动释放资源。

三.方案设计
先猜想一下这个程序的运行结果。假如运行“./process 20”,输出会是什么样?然后按照注释里的要求把代码补充完整,运行程序。可以多运行一会儿,并在此期间启动、关闭一些其它进程,看process 的输出结果有什么特点,记录下这个结果。开另一个终端窗口,运行“ps aux|grep process”命令,看看process 究竟启动了多少个进程。回到程序执行窗口,按“数字键+回车”尝试杀掉一两个进程,再到另一个窗口看进程状况。按q 退出程序再看进程情况。

四.测试数据及运行结果

1.正常测试数据(3组)及运行结果;

2.png

五.总结

在本次进程实验中,了解到操作系统中进程的执行机制,不是随机执行的,而是随着操作系统的调度而执行,而且了解到杀死进程的多种方式以及优缺点

六.附录:源代码(电子版, 纸质版不打印)

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<signal.h>
#include<ctype.h>

#define MAX_CHILD_NUMBER 10     /* 允许建立的子进程个数最大值 */
#define SLEEP_INTERVAL 4   /* 子进程睡眠时间 */

int proc_number = 0;    /*子进程编号*/
void do_something();

int main(int argc,char* argv[]){
        int child_proc_number = MAX_CHILD_NUMBER;   /*将子进程数量限定在最大值*/
        int i,ch;
        pid_t child_pid;
        pid_t pid[10] = {0};    /*初始化pid*/

    if(argc > 1){
                child_proc_number = atoi(argv[1]);  
                child_proc_number = (child_proc_number > 10) ? 10 : child_proc_number;
            
    }

    for(i=0;i<child_proc_number;i++){
                child_pid = fork();
                proc_number = i;
                if(child_pid == 0) do_something();
                if(child_pid != 0) pid[i] = child_pid;
            
    }

    while((ch=getchar())!='q'){
                if(isdigit(ch)){     
                                           kill(pid[ch-'0'],SIGTERM);
                                           pid[ch-'0'] = 0;
                                       }
            
    }

    for(i=0;i<child_proc_number;i++){
        if(pid[i] != 0){
                        kill(pid[i],SIGTERM);
                        pid[i] = 0;
                    
        }
            
    }
        return 0;

}

void do_something(){
    while(1){
                printf("this is process No.%d and its pid is %d\n",proc_number,getpid());
                sleep(SLEEP_INTERVAL);
            
    }

}
上一篇 下一篇

猜你喜欢

热点阅读