目录
前言
1 实验题目
2 实验目的
3 实验内容
3.1 进程的创建
3.1.1 步骤
3.1.2 关键代码
3.2 子进程执行新任务
3.2.1 步骤
3.2.2 关键代码
4 实验结果与分析
4.1 进程的创建
4.2 子进程执行新任务
5 代码
5.1 进程的创建
5.2 子进程执行新任务
前言
本实验为课设内容,仅为大家提供参考,请勿直接抄袭,另外,本次实验所用平台是Ubuntu 22.04 LTS,代码均是在终端进行编译的,不会的可以先了解怎么用终端编程,或者利用其他较为智能的开发环境进行编程
1 实验题目
实验二 Linux 进程管理
2 实验目的
通过进程的创建、撤销和运行加深对进程概念和进程并发执行的理解,明确进程和程序之间的区别。
3 实验内容
3.1 进程的创建
3.1.1 步骤
(1)步骤1:在目录实验2下用touch命令新建一个实验2-1.c文件,利用gedit命令打开编辑,复制清单3-1中的代码到实验2-1.c文件中并保存,利用gcc命令将其编译成可执行文件实验2-1。
(2)步骤2:在命令行输入./实验2-1运行该程序,观察运行结果。
(3)步骤3:多次运行程序,观察运行结果。
3.1.2 关键代码
if (x==0){sleep(rand() % 2);printf("a\n");}else{sleep(rand() % 3);printf("b\n");}if(x==0)printf("cc\n");else printf("fc\n");
3.2 子进程执行新任务
3.2.1 步骤
(1)步骤1:在目录实验2下用touch命令新建一个实验2-2.c文件,利用gedit命令打开编辑,复制清单3-2中的代码到实验2-2.c文件中并保存,利用gcc命令将其编译成可执行文件实验2-2。
(2)步骤2:在命令行输入./实验2-2运行该程序,观察运行结果。
3.2.2 关键代码
pid_t pid;/*fork another process*/pid = fork();if(pid<0){fprintf(stderr,"Fork Failed");exit(-1);}else if(pid==0){execlp("/bin/ls","ls",NULL);}else{/*parent process*//*parent wait for the child to complete*/wait(NULL);printf("Child Complete\n");exit(0);}
4 实验结果与分析
4.1 进程的创建
执行步骤2和3后,可以看到每次的结果不一定相同,可能是父进程先执行完毕,也可能是子进程先执行完毕,这说明进程的调度是不可预测的,即程序的执行不可在现,结果如下图所示:
图1.1 实验2-1步骤2和3
4.2 子进程执行新任务
执行步骤2后,会看到在终端上先输出了目录下的文件情况,再输出”Child Compelete”,说明父进程执行wait之后,会等待子进程执行完才会继续执行,结果如下图所示:
图1.2 实验2-2步骤2
5 代码
5.1 进程的创建
#include<stdio.h>
#include<stdlib.h>
int main(void){int x;srand((unsigned)time(NULL)); while((x=fork())==-1);if(x==0){sleep(rand()%2);printf("a\n"); }else{sleep(rand()%3);printf("b\n"); }if(x==0)printf("cc\n");else printf("fc\n");
}
5.2 子进程执行新任务
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
int main(void){pid_t pid;/*fork another process*/pid = fork();if(pid<0){fprintf(stderr,"Fork Failed");exit(-1);}else if(pid==0){execlp("/bin/ls","ls",NULL);}else{/*parent process*//*parent wait for the child to complete*/wait(NULL);printf("Child Complete\n");exit(0);}
}