课内实验报告
==进程==
专业名称:计算机科学与技术
班级: 计科1501
学生姓名:张伟男
学号(8位):04151007
指导老师:陈莉君
实验目的
通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX 规范中fork和kill系统调用的功能和使用。
实验准备
学习man 命令的用法,通过它查看fork和kill系统调用的在线帮助,并阅读参考资料,学会fork 与kill 的用法。复习C 语言的相关内容。
函数解释
kill()函数用于删除执行中的程序或者任务。调用格式为: kill(int PID, int IID); 其中:PID是要被杀死的进程号,IID为向将被杀死的进程发送的中断号。
运行结果
![image](http://note.youdao.com/yws/api/personal/file/WEBc7a402fe2739e399ddb416665aad5919?method=download&shareKey=d47c49839cbb6dcab3a4980542c11b20)
![image](http://note.youdao.com/yws/api/personal/file/WEB32be3f769f9a8536ba42b37bdc818efe?method=download&shareKey=d6d4e6e0046939e0cb5c32cafecf47c2)
实验结果
你最初认为运行结果会怎么样?
在屏幕上显示创建十个进程。
实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。
创建出十个进程,由于是死循环,设置sleep 10s,所以每隔5s就又创建了十个进程。只有当输入q加上回车的时候,结束此程序。
proc_number这个全局变量在各个子进程里的值相同吗?为什么?
在各个子进程中不相同,因为各子进程间相互独立。
kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?
kill 命令在程序中使用了2次,第一次为杀死指定序号的进程,第二次在程序运行结束时杀死所有进程。
使用kill命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退出方式哪种更好一些?
利用kill命令属于在外部强制杀死,而正常为main函数return后结束。正常的结束要更好一些。
源代码
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <ctype.h>
#define MAX_CHILD_NUMBER 10
#define SLEEP_INTERVAL 10
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};
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;#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <ctype.h>
#define MAX_CHILD_NUMBER 10
#define SLEEP_INTERVAL 10
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};
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();
if(child_pid < 0){
return -1;
}
else if(child_pid > 0){
pid[i] = child_pid;
}
else{
proc_number = i;
do_something();
}
}while((ch = getchar()) != 'q'){
if(isdigit(ch)){
kill(pid[ch-'0'], SIGTERM);
}
}
kill(0,SIGTERM);
return 0;
}
void do_something(){
for(;;){
printf("This is process No.%d and its pid is %d\n", proc_number, getpid());
sleep(SLEEP_INTERVAL);
}
}
if(child_pid < 0){
return -1;
}
else if(child_pid > 0){
pid[i] = child_pid;
}
else{
proc_number = i;
do_something();
}
}while((ch = getchar()) != 'q'){
if(isdigit(ch)){
kill(pid[ch-'0'], SIGTERM);
}
}
kill(0,SIGTERM);
return 0;
}
void do_something(){
for(;;){
printf("This is process No.%d and its pid is %d\n", proc_number, getpid());
sleep(SLEEP_INTERVAL);
}
}