实验二

作者: 空白_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);
                
        }
    
    }
    

    相关文章

      网友评论

          本文标题:实验二

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