进程实验报告

课内实验报告

==进程==

专业名称:计算机科学与技术

班级: 计科1501

学生姓名:张伟男

学号(8位):04151007

指导老师:陈莉君

实验目的

通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX 规范中fork和kill系统调用的功能和使用。

实验准备

学习man 命令的用法,通过它查看fork和kill系统调用的在线帮助,并阅读参考资料,学会fork 与kill 的用法。复习C 语言的相关内容。

函数解释

kill()函数用于删除执行中的程序或者任务。调用格式为: kill(int PID, int IID); 其中:PID是要被杀死的进程号,IID为向将被杀死的进程发送的中断号。

运行结果

进程实验报告_第1张图片

进程实验报告_第2张图片

实验结果

你最初认为运行结果会怎么样?

在屏幕上显示创建十个进程。

实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。

创建出十个进程,由于是死循环,设置sleep 10s,所以每隔5s就又创建了十个进程。只有当输入q加上回车的时候,结束此程序。

proc_number这个全局变量在各个子进程里的值相同吗?为什么?

在各个子进程中不相同,因为各子进程间相互独立。

kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?

kill 命令在程序中使用了2次,第一次为杀死指定序号的进程,第二次在程序运行结束时杀死所有进程。

使用kill命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退出方式哪种更好一些?

利用kill命令属于在外部强制杀死,而正常为main函数return后结束。正常的结束要更好一些。

源代码

#include
#include
#include
#include  
#include 
#include  
#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
#include
#include
#include  
#include 
#include  
#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);
        }
    }

你可能感兴趣的:(进程实验报告)