美文网首页
2019-04-09

2019-04-09

作者: 4e4f3178779e | 来源:发表于2019-04-10 20:12 被阅读0次

    计算机基础实验5-1

    一、实验目的:

    练习使用Linux系统调用函数创建进程、加载程序、终止进程、撤销进程,利用信号机制定制突发事件处理的编程,编写用信号机制对动态产生的进程实施管理,掌握多进程并发编程的基本方法。

    二、实验内容:

    先创建用户家目录下创建文件名为“姓名+学号+05”的子目录,作为本次实验目录,本次实验的所有代码都放到该目录下。要求将所有源代码与数据文件打包成文件”学号-姓名-lab5.tar.gz”, 压缩包与实验报告分别上传到指定目录下。

    任务1:编译下面程序,在两个不同终端运行,并在第三个终端运行下面命令:ps -ef|grep 程序名字,查找ps和kill命令的用法。

    回答问题:
    1.简述 ps展示出的各项信息的意义;
    2.解释kill命令的作用。

    #include "wrapper.h"
    #include <stdio.h>int sort(int a[],int n);int main()
    {
        int a[10];
        int i;
        printf("请输入10个整数:");
        for (i=0; i<10; i++)  scanf("%d",&a[i]);
        sort(a,10);
        for (i=0; i<10; i++)  printf("%d  ",a[i]);
        printf("\n");
    }int sort(int a[], int n)
    {
        int i,j,t;
        for (i=0; i<9; i++)
            for(j=i+1; j<10; j++)
            {
               if(a[i]>a[j])
               {
                  t=a[i];a[i]=a[j];a[j]=t;
               }
            }
    }
    

    任务2:编译下面程序,在一个终端运行,并在第二个终端运行下面命令:ps -ef|grep 程序名字,

    #include "wrapper.h"int main()
    {
        pid_t pid;  
        int x = 1;
    
        pid = fork();
        if (pid == 0) {   //子进程执行这段代码
            x=x+1;
            printf("child: x=%d\n", x);
        }
    
        if (pid>0) {    //父进程执行这段代码
            x=x-1;
            printf ("parent: x=%d\n",x);  
        }
        sleep(10);    //父、子进程都执行的代码
    }
    

    任务3:编译运行下面程序,回答问题:父进程执行了几次?子进程执行了几次?为什么?

    #include "wrapper.h"int main()
    {   pid_t pid;  int n;
         pid=fork();  //创建进程
      
         if(pid==0) {  //子进程将执行这个分支
            for(n = 6; n > 0; n--) {
                 printf("This is the child\n");
                 sleep(1);          
            }
            exit(0);
         }
         if (pid>0)   //父进程将执行这个分支
         {
             for(n = 3; n > 0; n--) {
                printf("This is the parent\n"); 
                sleep(1);
             }
             exit(0);
         }
         return;
      }
    

    任务4:编译运行下面程序,并在第二个终端运行ps -u命令,

    回答问题:
    1、父子进程的pid分别是多少?
    2、子进程那个进程的状态是 defunct,为什么?

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>int main()
    {
        pid_t pid;
        if((pid = fork()) < 0){
            perror("fork failed");
            exit(1);
        }else if(pid == 0){
            printf("child...\n");
        }else{  
            printf("parent...\n");
            while(1);
        }
        return 0;
    }
    

    三、涉及实验的相关情况介绍(包含使用软件或实验设备等情况):

    安装Linux操作系统的计算机

    四、报告内容

    • 任务一:
      截图:


      在这里插入图片描述

    1、简述 ps展示出的各项信息的意义
    Can是启动进程的用户名;
    28902891分别是./proc1进程PID;
    26182797分别是各自父进程的PID
    Pst/0pts/1分别是两个进程所在终端窗口的设备名
    00:00:00 ./proc1是进程的运行时间和运行路径
    2、解释kill命令的作用。
    Kill命令能够终止进程

    • 任务二:
      截图:


      在这里插入图片描述

      任务三:
      截图:


      在这里插入图片描述

    回答问题:父进程执行了几次?子进程执行了几次?为什么?
    答:父进程执行3次,子进程执行6次
    由于父子进程并发执行,父进程抢到了先机,打印一行This is the parent(第1行),执行sleep睡眠1秒,放弃cpu;
    接下来子进程获得CPU,执行打印This is the child(第2行),执行sleep睡眠1秒,放弃cpu
    CPU切换父进程;如此反复,导致this is the parent和this is the child交错显示

    • 任务四:
      截图:


      在这里插入图片描述

    回答问题:
    1、父子进程的pid分别是多少?
    pid为3406
    2、子进程那个进程的状态是 defunct,为什么?
    子进程结束后,由于父进程尚未对其做清理工作,子进程处于僵尸状

    五、实验分析和总结等

    学会了如何使用Linux系统调用函数创建进程、加载程序、终止进程、撤销进程.明白了进程与线程的关系.

    相关文章

      网友评论

          本文标题:2019-04-09

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