西 安 邮 电 大学 (计算机学院)
操作系统课内实验报告
实验名称:进程
专业名称:计算机科学与技术
班 级:计科1503
学生姓名:魏新超
学号(8位):04151091
指导教师:陈莉君
实验日期:2017年4月13日
一. 实验目的及实验环境
通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX 规范中fork和kill系统调用的功能和使用
实验环境:deepin-15.3
二. 实验内容
- 你最初认为运行结果会怎么样?
会按序号执行,当按q时退出 - 实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。
实际结果与起初猜想不同,不是按顺序输出,而是随机输出的,每隔10秒输出10个进程,进程的执行是系统随机调度的。 - proc_number 这个全局变量在各个子进程里的值相同吗?为什么?
不相同,proc_number在每个子进程中被修改,所以不相同。 - kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?
调用次数按用户输入次数,没输入一次执行一次,每次执行完杀死一个进程,进程被杀死终结 - 使用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);
}
}
网友评论