进程实验报告

xiaoxiao2021-02-28  129

课内实验报告

==进程==

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

班级: 计科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); } }
转载请注明原文地址: https://www.6miu.com/read-63883.html

最新回复(0)