一、实验目的
1、深入理解进程控制相关概念; 2、掌握守护进程及Linux进程之间的关系; 3、掌握进程控制时常用的函数,如fork, wait, exec, exit等。
二、实验内容
某进程创建一子进程,子进程运行“ls -l”指令。要求父进程先以阻塞方式等待子进程结束,当该子进程正常退出后,父进程再创建新的子进程,反复打印“child2 process is active!”;此时结束父进程,并观察子进程的运行情况。
三、实验环境
虚拟机软件:VMware 16 Pro Linux操作系统版本:CentOS-7-64位
四、参考代码 - #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- int main(int argc,char* argv[]){
- int status;
- status=fork();
- if(-1==status){
- perror("Create Child Process 1 error!\n");
- exit(-1);
- }else if(0==status){
- execl("/bin/ls","ls","-1",NULL);
- exit(0);
- }else if(status>0){
- if(status=wait(NULL)){
- status=fork();
- if(-1==status){
- perror("Create Child Process 2 error!\n");
- exit(-1);
- }else if(0==status){
- while(1){
- printf("Child2 process is active!\n");
- sleep(5);
- }
- }else if(status>0){
- exit(0);
- }
- }
- }
- }
复制代码
五、实验步骤
步骤1. 编辑源代码test4.c
源代码test4.c内容见上述参考代码。 - mkdir test4
- cd test4
- vim test4.c
复制代码
这段代码创建两个子进程,第一个子进程执行ls命令,第二个子进程则进入一个无限循环,每隔5秒输出一次消息。
(1)创建子进程1:
- status =fork();:调用fork函数创建一个新的进程。如果成功,fork返回两次:在父进程中返回新子进程的进程ID,在子进程中返回0;如果失败,返回-1。
- 使用perror和exit函数处理创建进程失败的情况。
(2)子进程1执行ls命令:
- 进入子进程1的执行流程,使用execl函数替换当前进程的映像,以便执行/bin/ls命令。
- 如果execl执行失败,使用perror打印错误信息,并调用exit退出子进程1。
(3)等待子进程1完成:
- 在父进程中,使用wait函数等待子进程1的完成。
- 完成后,再次调用fork函数创建子进程2。
(4)创建子进程2:
- 与之前类似,再次调用fork函数创建另一个子进程。
(5)子进程2执行循环任务:
- 在子进程2中,使用无限循环打印信息,并使用sleep函数暂停5秒。
(6)父进程处理:
步骤2. 编译源代码test4.c
步骤3. 运行可执行程序test4
六、实验结果
实验结果如下图,每隔5秒弹出一条消息。
七、实验总结
Linux进程控制实验是一项非常重要的实验,可以让学生深入了解Linux操作系统中进程的创建、运行和控制。通过这个实验,我学会了如何使用Linux系统调用来创建、终止和等待进程,以及如何使用信号来处理进程间通信和同步。 进程代表一个程序的一次执行过程,是一个动态的概念,涉及程序运行时执行状态和所使用的资源的管理。在进程控制中,进程主要以三种状态出现:就绪、执行和阻塞。Linux系统将进程的执行划分为用户模式和内核模式。当用户执行应用程序或内核以外的其它程序时,进程运行在用户空间;反之,则运行在内核空间。当用户进程需要内核提供功能支持时,可通过中断或系统调用进入内核空间。 在这个实验中,我学会了如何使用fork()系统调用来创建子进程,并了解了子进程与父进程之间的关系。我还学会了如何使用exec()系统调用来在新的进程中执行程序。此外,我还学会了如何使用wait()和waitpid()系统调用来等待子进程完成,并获取子进程的退出状态。 通过这个实验,我不仅深入了解了Linux操作系统中进程的创建、运行和控制,还掌握了Linux系统调用的使用方法。同时,我也体会到了操作系统中进程间通信和同步的重要性。总之,这个实验让我收获颇丰,希望可以在今后的学习和工作中运用所学知识。 |