实验二

作者: 空白_ce1f | 来源:发表于2017-05-02 20:26 被阅读0次

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

操作系统课内实验报告

实验名称:进程

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

班 级:计科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);
            
    }

}

相关文章

  • 高级语言程序设计实验(双数号题)

    实验二 实验四 实验六 实验八 实验十

  • 2017-05-28

    实验一 实验二 实验三 实验四 实验五

  • 实验二

    教学管理系统 版本:0.2 生成学期课表用况说明 日期:2018/4/18 生成学期课表.doc 修改日期:201...

  • 实验二

  • 实验二

    实验二 实验一链接:https://www.jianshu.com/p/61b58f5240c4 用况图: 具体用...

  • 实验二

  • 实验二

    西 安 邮 电 大学 (计算机学院) 操作系统课内实验报告 实验名称:进程 专业名称:计算机科学与技术 班 级:计...

  • 实验二

    实验二 Linux基础操作实践 一、实验目的 1.掌握基本语言命令操作 2.熟练使用基本命令操作 3.掌握远程登录...

  • 实验(二)

    来到山洞,一片漆黑,但有20束灯罩着底下的玻璃桶,不多不少刚好20束,那些透明的玻璃桶在顶部留了几个孔,与普通的...

  • 实验二

    材料:袋子 彩铅或铅笔 水 (这个实验可能会要接水,所以呢,我在厕所...

网友评论

      本文标题:实验二

      本文链接:https://www.haomeiwen.com/subject/mnlhtxtx.html