Linux进程控制编程

一、实验目的:

练习使用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系统调用函数创建进程、加载程序、终止进程、撤销进程.明白了进程与线程的关系.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值