[Linux服务器] Linux实验四:进程控制

216 0
Honkers 2025-5-18 08:19:46 来自手机 | 显示全部楼层 |阅读模式


一、实验目的

1、深入理解进程控制相关概念;
2、掌握守护进程及Linux进程之间的关系;
3、掌握进程控制时常用的函数,如fork, wait, exec, exit等。

二、实验内容

某进程创建一子进程,子进程运行“ls -l”指令。要求父进程先以阻塞方式等待子进程结束,当该子进程正常退出后,父进程再创建新的子进程,反复打印“child2 process is active!”;此时结束父进程,并观察子进程的运行情况。

三、实验环境

虚拟机软件:VMware 16 Pro
Linux操作系统版本:CentOS-7-64位

四、参考代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/wait.h>
  6. int main(int argc,char* argv[]){
  7. int status;
  8. status=fork();
  9. if(-1==status){
  10. perror("Create Child Process 1 error!\n");
  11. exit(-1);
  12. }else if(0==status){
  13. execl("/bin/ls","ls","-1",NULL);
  14. exit(0);
  15. }else if(status>0){
  16. if(status=wait(NULL)){
  17. status=fork();
  18. if(-1==status){
  19. perror("Create Child Process 2 error!\n");
  20. exit(-1);
  21. }else if(0==status){
  22. while(1){
  23. printf("Child2 process is active!\n");
  24. sleep(5);
  25. }
  26. }else if(status>0){
  27. exit(0);
  28. }
  29. }
  30. }
  31. }
复制代码

五、实验步骤

步骤1. 编辑源代码test4.c

源代码test4.c内容见上述参考代码。

  1. mkdir test4
  2. cd test4
  3. 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)父进程处理:

  • 在父进程中,调用exit函数退出程序。

步骤2. 编译源代码test4.c

  1. gcc test4.c -o test4 -g
复制代码

步骤3. 运行可执行程序test4

  1. ./test4
复制代码

六、实验结果

实验结果如下图,每隔5秒弹出一条消息。

七、实验总结

  Linux进程控制实验是一项非常重要的实验,可以让学生深入了解Linux操作系统中进程的创建、运行和控制。通过这个实验,我学会了如何使用Linux系统调用来创建、终止和等待进程,以及如何使用信号来处理进程间通信和同步。
  进程代表一个程序的一次执行过程,是一个动态的概念,涉及程序运行时执行状态和所使用的资源的管理。在进程控制中,进程主要以三种状态出现:就绪、执行和阻塞。Linux系统将进程的执行划分为用户模式和内核模式。当用户执行应用程序或内核以外的其它程序时,进程运行在用户空间;反之,则运行在内核空间。当用户进程需要内核提供功能支持时,可通过中断或系统调用进入内核空间。
  在这个实验中,我学会了如何使用fork()系统调用来创建子进程,并了解了子进程与父进程之间的关系。我还学会了如何使用exec()系统调用来在新的进程中执行程序。此外,我还学会了如何使用wait()和waitpid()系统调用来等待子进程完成,并获取子进程的退出状态。
  通过这个实验,我不仅深入了解了Linux操作系统中进程的创建、运行和控制,还掌握了Linux系统调用的使用方法。同时,我也体会到了操作系统中进程间通信和同步的重要性。总之,这个实验让我收获颇丰,希望可以在今后的学习和工作中运用所学知识。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行