实验7编写多进程程序1 下载本文

内容发布更新时间 : 2024/10/20 5:33:07星期一 下面是文章的全部内容请认真阅读。

实验七 编写多进程程序

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 #include #include #include #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 #include #include #include #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文档 可自由复制编辑