内容发布更新时间 : 2025/2/9 5:58:06星期一 下面是文章的全部内容请认真阅读。
实验七 编写多进程程序
1.实验目的
通过编写多进程程序,使读者熟练掌握fork()、exec()、wait()和waitpid()等函数的使用,进一步理解在Linux中多进程编程的步骤。
2.实验内容
该实验有3个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一个子进程运行“ls -l”指令,另一个子进程在暂停5s之后异常退出,父进程先用阻塞方式等待第一个子进程的结束,然后用非阻塞方式等待另一个子进程的退出,待收集到第二个子进程结束的信息,父进程就返回。
3.实验步骤
(1)画出该实验流程图 该实验流程图如图所示。
图 实验7.1流程图
(2)实验源代码(multi_proc.c)
先看一下下面的代码,这个程序能得到我们所希望的结果吗,它的运行会产生几个进程?请读者回忆一下fork()调用的具体过程。
答:会产生四个进程
/* multi_proc_wrong.c */ #include
int main(void) {
pid_t child1, child2, child; /*创建两个子进程*/ child1 = fork(); child2 = fork();
/*子进程1的出错处理*/ if (child1 == -1) {
printf(\ exit(1); }
else if (child1 == 0) /*在子进程1中调用execlp()函数*/ {
printf(\ if (execlp(\ {
word文档 可自由复制编辑
printf(\ } }
if (child2 == -1) /*子进程2的出错处理*/ {
printf(\ exit(1); }
else if( child2 == 0 ) /*在子进程2中使其暂停5s*/ {
printf(\ sleep(5); exit(0); }
else /*在父进程中等待两个子进程的退出*/ {
printf(\
child = waitpid(child1, NULL, 0); /* 阻塞式等待 */ if (child == child1) {
printf(\ } else {
printf(\ }
do {
child =waitpid(child2, NULL, WNOHANG);/* 非阻塞式等待 */ if (child == 0) {
printf(\ sleep(1); }
} while (child == 0);
if (child == child2) {
printf(\ } else {
printf(\ }
word文档 可自由复制编辑
} exit(0); }
编译和运行以上代码,并观察其运行结果。它的结果是我们所希望的吗?
答:不是
看完前面的代码之后,再观察下面的代码,它们之间有什么区别,会解决哪些问题。
答:将child2进程的产生放在判断不是child1进程的执行代码中,在第一个例子中
由于进程1在执行的时候又fork出一个进程,导致产生了第四个进程,这个进程是child1的子进程,它会将ls命令在执行一遍,而在第二个例子中由于产生child代码放在
判断中,故而可以避免在child1中重复fork新进程。
/*multi_proc.c */ #include
int main(void) {
pid_t child1, child2, child;
/*创建两个子进程*/ child1 = fork();
/*子进程1的出错处理*/ if (child1 == -1) {
printf(\ exit(1); }
else if (child1 == 0) /*在子进程1中调用execlp()函数*/ {
printf(\ if (execlp(\ {
printf(\ } }
word文档 可自由复制编辑