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);
}
}
}
}
源代码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命令:
execl
函数替换当前进程的映像,以便执行/bin/ls
命令。execl
执行失败,使用perror
打印错误信息,并调用exit
退出子进程1。(3)等待子进程1完成:
wait
函数等待子进程1的完成。fork
函数创建子进程2。(4)创建子进程2:
fork
函数创建另一个子进程。(5)子进程2执行循环任务:
sleep
函数暂停5秒。(6)父进程处理:
exit
函数退出程序。gcc test4.c -o test4 -g
./test4
实验结果如下图,每隔5秒弹出一条消息。
Linux进程控制实验是一项非常重要的实验,可以让学生深入了解Linux操作系统中进程的创建、运行和控制。通过这个实验,我学会了如何使用Linux系统调用来创建、终止和等待进程,以及如何使用信号来处理进程间通信和同步。 进程代表一个程序的一次执行过程,是一个动态的概念,涉及程序运行时执行状态和所使用的资源的管理。在进程控制中,进程主要以三种状态出现:就绪、执行和阻塞。Linux系统将进程的执行划分为用户模式和内核模式。当用户执行应用程序或内核以外的其它程序时,进程运行在用户空间;反之,则运行在内核空间。当用户进程需要内核提供功能支持时,可通过中断或系统调用进入内核空间。 在这个实验中,我学会了如何使用fork()系统调用来创建子进程,并了解了子进程与父进程之间的关系。我还学会了如何使用exec()系统调用来在新的进程中执行程序。此外,我还学会了如何使用wait()和waitpid()系统调用来等待子进程完成,并获取子进程的退出状态。 通过这个实验,我不仅深入了解了Linux操作系统中进程的创建、运行和控制,还掌握了Linux系统调用的使用方法。同时,我也体会到了操作系统中进程间通信和同步的重要性。总之,这个实验让我收获颇丰,希望可以在今后的学习和工作中运用所学知识。