(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.实验步骤
- 借助百度引擎学习进程与程序的区别。
进程是一个动态的概念,而程序是一个静态的概念,程序是指令的有序集合,无执行含义,进程则强调执行的过程;进程具有并行特征(独立性,异步性),程序没有;不同的进程可以包含同一程序,同一程序在执行中也可以产生多个进程。它们的本质区别就是进程是动态的,而程序则是静态的。
- 认识fork函数。
fork系统调用用于创建一个新进程,称为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork()系统调用之后的下一条指令。子进程使用相同的pc(程序计数器),相同的CPU寄存器,在父进程中使用的相同打开文件。
它不需要参数并返回一个整数值。下面是fork()返回的不同值。
负值:创建子进程失败。
零:返回到新创建的子进程。
正值:返回父进程或调用者。该值包含新创建的子进程的进程ID
- 调用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.实验思考题
- 进程和程序有何区别?
进程是一个动态的概念,而程序是一个静态的概念,程序是指令的有序集合,无执行含义,进程则强调执行的过程;进程具有并行特征(独立性,异步性),程序没有;不同的进程可以包含同一程序,同一程序在执行中也可以产生多个进程。它们的本质区别就是进程是动态的,而程序则是静态的。
- 谈谈你对fork()函数的认识。
fork系统调用用于创建一个新进程,称为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork()系统调用之后的下一条指令。子进程使用相同的pc(程序计数器),相同的CPU寄存器,在父进程中使用的相同打开文件。
它不需要参数并返回一个整数值。下面是fork()返回的不同值。
负值:创建子进程失败。
零:返回到新创建的子进程。
正值:返回父进程或调用者。该值包含新创建的子进程的进程ID