实验5:进程管理【nyist】

1.实验目的

(1)理解进程与程序的区别。

(2)了解fork( )系统调用的返回值,掌握调用fork( )创建进程的方法。

(3)掌握进程并发执行的原理,理解进程并发执行的特点,区分进程并发执行与串行执行。 (4)能够熟练使用进程管理命令对进程进行管理

2.实验环境

(1)一台已经安装好的Window系统的计算机。

(2)安装好的CentOS虚拟机。

3.实验内容

(1)使用vi编辑器编写C语言程序,调用fork函数创建进程。

  编写一段程序,利用系统调用fork( )创建两个进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

#include <stdio.h>
  void main()
   {
    int p1,p2;
    while  ((p1=fork())= =-1);  
     if (p1= =0)
       putchar(‘b’);
     else
     {
        while  ((p2=fork()= =-1);
         if (p2= =0)
             putchar(‘c’);
         else
             putchar(‘a’);

}

}

(2)调用fork创建进程,查看进程fork函数一次调用,两个返回值,并查看两个返回值。

#include <unistd.h> 

#include <stdio.h>  

int main ()  

{  

    pid_t fpid; //fpid表示fork函数返回的值 

    int count=0; 

    fpid=fork();  

    if (fpid < 0)  

        printf("error in fork!");  

    else if (fpid == 0) { 

        printf("I am the child process, my process id is %d\n",getpid());  

        printf("I am son.\n"); 

        count++; 

    } 

    else { 

        printf("i am the parent process, my process id is %d\n",getpid());  

        printf("I am father!\n"); 

        count++; 

    } 

    printf("统计结果是: %d\n",count); 

    return 0; 

(2)进程管理命令

练习ps pstree top kill  jobs nice renice at corntabd等进程管理命令,参考(进程管理命令文档进行练习)

4.实验步骤

  1. 借助百度引擎学习进程与程序的区别。

进程是一个动态的概念,而程序是一个静态的概念,程序是指令的有序集合,无执行含义,进程则强调执行的过程;进程具有并行特征(独立性,异步性),程序没有;不同的进程可以包含同一程序,同一程序在执行中也可以产生多个进程。它们的本质区别就是进程是动态的,而程序则是静态的。

  1. 认识fork函数。

fork系统调用用于创建一个新进程,称为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork()系统调用之后的下一条指令。子进程使用相同的pc(程序计数器),相同的CPU寄存器,在父进程中使用的相同打开文件。

它不需要参数并返回一个整数值。下面是fork()返回的不同值。

负值:创建子进程失败。

零:返回到新创建的子进程。

正值:返回父进程或调用者。该值包含新创建的子进程的进程ID

  1. 调用fork函数创建进程

编写一段程序,利用系统调用fork( )创建两个进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

(4)查看结果

调用fork创建进程,查看进程fork函数一次调用,两个返回值,并查看两个返回值。

#include <unistd.h> 

#include <stdio.h>  

int main ()  

{  

    pid_t fpid; //fpid表示fork函数返回的值 

    int count=0; 

    fpid=fork();  

    if (fpid < 0)  

        printf("error in fork!");  

    else if (fpid == 0) { 

        printf("I am the child process, my process id is %d\n",getpid());  

        printf("I am son.\n"); 

        count++; 

    } 

    else { 

        printf("i am the parent process, my process id is %d\n",getpid());  

        printf("I am father!\n"); 

        count++; 

    } 

    printf("统计结果是: %d\n",count); 

    return 0; 

查看结果

(5)练习进程管理命令

练习ps pstree top kill  jobs nice renice at corntabd等进程管理命令,参考(进程管理命令文档进行练习)

ps相关指令练习

pstree相关命令练习

top相关命令练习

在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况:

高亮显示当前运行进程,敲击键盘“b”(打开/关闭加亮效果),top的视图变化如下:

敲击键盘“x”(打开/关闭排序列的加亮效果),top的视图变化如下:

可以看到,top默认的排序列是“%CPU”。通过”shift + >”或”shift + <”可以向右或左改变排序列,现在是由shr排序

top-c练习

jobs相关命令练习

#打开vim 编辑a.txt, 并且按[Ctrl+z]隐藏

$ vim a.txt

[1]+  Stopped                 vim a.txt

#在后台运行两个ping任务

$ ping localhost -a > /dev/null &

[2] 7868

$ ping localhost -a > /dev/null &

[3] 7869

#显示任务

$ jobs

#显示任务,并带上PID

$ jobs -l

#显示暂停的任务

$ jobs -s

#显示运行中的任务

$ jobs -r

#仅显示任务的PID

$ jobs -p

#将编号为2的任务拿到前台来运行,并按下[Ctrl+z],暂停该任务

$ fg 2

#让编号为2的任务在后台运行

$ bg 2

$ jobs

nice命令练习

不用任何参数执行命令"nice"(见第1行),所以显示出当前的程序运行优先级为0(见第2行)。由此可知系统缺省的程序运行优先级为0。

第1个nice命令以缺省值来调整第2个nice命令运行的优先级,既在系统缺省的程序运行优先级0的基础之上增加10,得到新的程序运行优先级10,然后以优先级10来运行第2个nice命令;第2个nice命令显示当前程序运行的优先级为10。

第1个nice命令以缺省值来调整第2个nice命令运行的优先级,既在系统缺省的程序运行优先级0的基础之上增加10,得到新的程序运行优先级10,然后以优先级10来运行第2个nice命令;第2个nice命令又以缺省值来调整第3个nice命令运行的优先级,既在第2个nice命令运行优先级基础之上再增加10,得到新的程序运行优先级20,但20大于最高程序运行优先级19,所以以优先级19来运行第3个nice命令;第3个nice命令显示当前程序运行的优先级为19。

以参数“-n”的形式指定程序运行优先级的调整值,系统缺省优先级0加上调整值-21得到新的优先级-21(小于-20),因此程序最终的运行优先级为-20。

参数“--1”、“-+1”和 “-1”中的第一个字符“-”都是语法定义的指定程序运行优先级调整值的标志符,第一个字符“-”之后的值为指定的程序运行优先级的调整值。

kill 相关命令练习

列出所有信号名称

得到指定信号的数值

先用ps查找进程,然后用kill杀掉

彻底杀死进程

(6)设置定时任务和周期性任务

at相关命令练习

三天后的下午 5 点钟执行 /bin/ls

明天17点钟,输出时间到指定文件内

计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务

删除已经设置的任务

显示已经设置的任务内容

设置开机启动

crontab相关命令练习

安装crontab:

yum install crontabs

启动服务

关闭服务

重启服务

查看crontab服务状态:

加入开机自动启动:

chkconfig –level 35 crond on

crontab -e修改crontab文件

列出crontab文件,可以用 crontab -l

5.实验思考题

  1. 进程和程序有何区别?

进程是一个动态的概念,而程序是一个静态的概念,程序是指令的有序集合,无执行含义,进程则强调执行的过程;进程具有并行特征(独立性,异步性),程序没有;不同的进程可以包含同一程序,同一程序在执行中也可以产生多个进程。它们的本质区别就是进程是动态的,而程序则是静态的。

  1. 谈谈你对fork()函数的认识。

fork系统调用用于创建一个新进程,称为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork()系统调用之后的下一条指令。子进程使用相同的pc(程序计数器),相同的CPU寄存器,在父进程中使用的相同打开文件。

它不需要参数并返回一个整数值。下面是fork()返回的不同值。

负值:创建子进程失败。

零:返回到新创建的子进程。

正值:返回父进程或调用者。该值包含新创建的子进程的进程ID

6.实验心得体会

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VIXeH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值