一、实验目的:
练习使用Linux系统调用函数创建进程、加载程序、终止进程、撤销进程,利用信号机制定制突发事件处理的编程,编写用信号机制对动态产生的进程实施管理,掌握多进程并发编程的基本方法。
二、实验内容:
先创建用户家目录下创建文件名为“姓名+学号+05”的子目录,作为本次实验目录,本次实验的所有代码都放到该目录下。要求将所有源代码与数据文件打包成文件”学号-姓名-lab5.tar.gz”, 压缩包与实验报告分别上传到指定目录下。
任务1:编译下面程序,在两个不同终端运行,并在第三个终端运行下面命令:ps -ef|grep 程序名字,查找ps和kill命令的用法。
回答问题:
1.简述 ps展示出的各项信息的意义;
2.解释kill命令的作用。
#include "wrapper.h"
#include <stdio.h>int sort(int a[],int n);int main()
{
int a[10];
int i;
printf("请输入10个整数:");
for (i=0; i<10; i++) scanf("%d",&a[i]);
sort(a,10);
for (i=0; i<10; i++) printf("%d ",a[i]);
printf("\n");
}int sort(int a[], int n)
{
int i,j,t;
for (i=0; i<9; i++)
for(j=i+1; j<10; j++)
{
if(a[i]>a[j])
{
t=a[i];a[i]=a[j];a[j]=t;
}
}
}
任务2:编译下面程序,在一个终端运行,并在第二个终端运行下面命令:ps -ef|grep 程序名字,
#include "wrapper.h"int main()
{
pid_t pid;
int x = 1;
pid = fork();
if (pid == 0) { //子进程执行这段代码
x=x+1;
printf("child: x=%d\n", x);
}
if (pid>0) { //父进程执行这段代码
x=x-1;
printf ("parent: x=%d\n",x);
}
sleep(10); //父、子进程都执行的代码
}
任务3:编译运行下面程序,回答问题:父进程执行了几次?子进程执行了几次?为什么?
#include "wrapper.h"int main()
{ pid_t pid; int n;
pid=fork(); //创建进程
if(pid==0) { //子进程将执行这个分支
for(n = 6; n > 0; n--) {
printf("This is the child\n");
sleep(1);
}
exit(0);
}
if (pid>0) //父进程将执行这个分支
{
for(n = 3; n > 0; n--) {
printf("This is the parent\n");
sleep(1);
}
exit(0);
}
return;
}
任务4:编译运行下面程序,并在第二个终端运行ps -u命令,
回答问题:
1、父子进程的pid分别是多少?
2、子进程那个进程的状态是 defunct,为什么?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{
pid_t pid;
if((pid = fork()) < 0){
perror("fork failed");
exit(1);
}else if(pid == 0){
printf("child...\n");
}else{
printf("parent...\n");
while(1);
}
return 0;
}
三、涉及实验的相关情况介绍(包含使用软件或实验设备等情况):
安装Linux操作系统的计算机
四、报告内容
-
任务一:
截图:
在这里插入图片描述
1、简述 ps展示出的各项信息的意义
Can
是启动进程的用户名;
2890
、2891
分别是./proc1
进程PID;
2618
、2797
分别是各自父进程的PID
Pst/0
、pts/1
分别是两个进程所在终端窗口的设备名
00:00:00 ./proc1
是进程的运行时间和运行路径
2、解释kill命令的作用。
Kill
命令能够终止进程
-
任务二:
截图:
在这里插入图片描述
任务三:
截图:
在这里插入图片描述
回答问题:父进程执行了几次?子进程执行了几次?为什么?
答:父进程执行3次,子进程执行6次
由于父子进程并发执行,父进程抢到了先机,打印一行This is the parent(第1行),执行sleep睡眠1秒,放弃cpu;
接下来子进程获得CPU,执行打印This is the child(第2行),执行sleep睡眠1秒,放弃cpu
CPU切换父进程;如此反复,导致this is the parent和this is the child交错显示
-
任务四:
截图:
在这里插入图片描述
回答问题:
1、父子进程的pid分别是多少?
pid
为3406
2、子进程那个进程的状态是 defunct,为什么?
子进程结束后,由于父进程尚未对其做清理工作,子进程处于僵尸状
五、实验分析和总结等
学会了如何使用Linux系统调用函数创建进程、加载程序、终止进程、撤销进程.明白了进程与线程的关系.
网友评论