一、实验题目
Linux 进程控制
二、实验目的
通过进程的创建、撤销和运行加深对进程概念和进程并发执行的理解,明确进程和程序之间的区别。
三、实验内容(实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键代码)
(1)任务一:进程的创建
任务要求:编写一段程序,使用系统调用 fork()创建一个子进程。当此程序运行时,在系统
中有一个父进程和一个子进程活动。让每一个进程在屏幕上分别显示字符:父进程显示字符“b”;
子进程显示字符“a”,另外父子进程都显示字符“c”。
步骤 1:使用 vi 或 gedit 新建一个 fork_demo.c 程序,然后拷贝清单 3-1 中的程序,使用 cc 或者
gcc 编译成可执行文件 fork_demo。例如,可以使用 gcc –o fork_demo fork_demo.c 完成编译。
步骤 2:在命令行输入./fork_demo 运行该程序。
步骤 3:多次运行程序,观察屏幕上的显示结果,并分析多次运行为什么会出现不同的结果。
(2)任务二:子进程执行新任务
任务要求:编写一段程序,使用系统调用 fork()创建一个子进程。子进程通过系统调用 exec
更换自己原有的执行代码,转去执行 Linux 命令/bin/ls (显示当前目录的列表),然后调用 exit()函
数结束。父进程则调用 waitpid()等待子进程结束,并在子进程结束后显示子进程的标识符,然后正
常结束。程序执行过程如图 3-1 所示。
步骤 1:使用 vi 或 gedit 新建一个 exec_demo.c 程序,然后拷贝清单 3-2 中的程序(该程序的执
行如图 3-1 所示),使用 cc 或者 gcc 编译成可执行文件 exec_demo。例如,可以使用 gcc –o exec_demo
exec_demo.c 完成编译。
步骤 2:在命令行输入./exec_demo 运行该程序。
步骤 3:观察该程序在屏幕上的显示结果,并分析。
图 3-1 exec_demo.c 程序的执行过程
四、实验结果与分析
实验一:
这段程序通过调用fork()函数创建一个子进程,并在父子进程中分别打印字符"a"和字符"b",最后在两个进程中都打印字符"c"。
无论是哪种输出,都符合多进程并发执行的特点。
分析:
srand((unsigned)time(NULL))用于初始化随机数生成器。
fork()函数用于创建子进程。在父进程中,fork()返回子进程的进程ID;在子进程中,fork()返回0。如果创建进程失败,fork()返回-1。
sleep(rand() % 2)和sleep(rand() % 3)用于让进程随机等待一段时间。
printf函数用于打印字符。
父进程和子进程都会执行最后一行的printf("c")。
实验二:
这段程序通过调用fork()函数创建一个子进程,并在子进程中执行execlp("/bin/ls","ls",NULL)命令,execlp 函数通过指定的文件路径 file 来加载并执行一个新的程序。第一个参数 file 是要执行的可执行文件的路径。在这种情况下,/bin/ls 表示要执行的可执行文件是 /bin 目录下的 ls 程序。即调用ls命令来列出当前目录的文件和文件夹。而第二个参数“ls”是这个运行程序的命名。父进程会等待子进程执行完毕,然后打印"Child Complete"。
程序运行时,输出可能类似于以下内容:
分析:
fork()函数用于创建子进程。在父进程中,fork()返回子进程的进程ID;在子进程中,fork()返回0。如果创建进程失败,fork()返回-1。
execlp("/bin/ls","ls",NULL)用于在子进程中执行ls命令。
父进程使用wait(NULL)函数等待子进程执行完毕,以确保在子进程完成之前不会退出。
子进程通过execlp()函数执行ls命令,并将ls的输出打印到标准输出。
父进程在子进程执行完毕后,打印"Child Complete"。
五、小结与心得体会
1.进程创建:使用fork()函数可以创建一个新的子进程,子进程是父进程的副本。子进程从fork()函数返回的地方开始执行,可以继续执行父进程的代码或执行新的任务。
2.并发执行:在多进程环境中,父进程和子进程可以并发执行,彼此独立运行。操作系统通过进程调度算法来决定进程的执行顺序和时间片分配。
3.随机性:在实验中,使用rand()和srand()函数生成随机数,通过随机等待时间模拟进程的不确定性和并发性。这样可以观察到不同进程的执行顺序可能会有所变化。
4.子进程的新任务:在清单2-2中,展示了子进程如何执行新的任务。通过调用execlp()函数,子进程可以运行其他可执行程序,实现不同的功能。父进程可以通过等待子进程的完成来协同它们的执行顺序。
5.父子进程通信:在这两个实验中,并没有直接的父子进程之间的通信。它们是通过操作系统的进程管理机制来实现并发执行和等待子进程完成的。
6.实验结果的不确定性:由于进程调度和随机性的影响,实验结果可能会有多种可能性。同样的程序可能会产生不同的输出,这是多进程环境下的特点。