课内实验报告
==进程==
专业名称:计算机科学与技术
班级: 计科1501
学生姓名:张伟男
学号(8位):04151007
指导老师:陈莉君
实验目的
通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX 规范中fork和kill系统调用的功能和使用。
实验准备
学习man 命令的用法,通过它查看fork和kill系统调用的在线帮助,并阅读参考资料,学会fork 与kill 的用法。复习C 语言的相关内容。
函数解释
kill()函数用于删除执行中的程序或者任务。调用格式为: kill(int PID, int IID); 其中:PID是要被杀死的进程号,IID为向将被杀死的进程发送的中断号。
运行结果
实验结果
你最初认为运行结果会怎么样?
在屏幕上显示创建十个进程。
实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。
创建出十个进程,由于是死循环,设置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);
}
}