实验目的
- 了解多进程编程原理
- 掌握多进程编程
实验内容
- 通过编写多进程程序,熟练掌握fork()、wait()和waitpid()等函数的使用
- 该实验有3个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一个子进程运行输出进程号指令,另一个子进程在暂停5s后异常退出。父进程先用阻塞方式等待第一个进程的结束,然后用非阻塞方式等待另一个子进程的退出,待收集到第2个子进程结束的消息后,父进程就返回。
实验原理
- 在 Linux 中创建一个新进程的唯一方法是使用fork()函数。
- fork()函数用于从已存在的一个进程中创建一个新的进程,新进程称为子进程,而原进程称为父进程。使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程上下文、代码段、进程堆栈、内存信息、打开的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。
程序设计
#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "sys/wait.h"
#include "sys/types.h"
int main()
{
pid_t child1,child2,child;
child1=fork();//子进程1的创建
if(child1 == -1 )//子进程1的出错处理
{
printf("子进程1出错\n");
exit(1);//异常退出
}
else if(child1 == 0)//执行子进程1的约定输出
printf("我是子进程1,我的进程号为%d\n",getpid());
else//轮到父进程
{
child2=fork();//子进程2的创建
if(child1 == -1 )//子进程2的出错处理
{
printf("子进程2出错\n");
exit(1);//异常退出
}
else if(child2 == 0)//执行子进程2的暂停
{
printf("子进程2:稍等5秒\n");
sleep(5);
printf("子进程2:好了\n");
exit(0);
}
printf("我是父进程\n");
child=waitpid(child1,NULL,0);//阻塞式等待
if(child == child1)
{
printf("我是父进程,子进程1的进程号是:%d\n",child);
}
else
{
printf("出错了\n");
}
do
{
child =waitpid(child2,NULL,WNOHANG);//非阻塞式等待
if(child == 0)
{
printf("我是父进程,子进程2还没出现\n");
sleep(1);
}
}while(child == 0);
if(child == child2)
{
printf("我是父进程,子进程2的进程号是:%d\n",child);
}
else
{
printf("出错了\n");
}
}
exit(0);
}
运行结果
实验总结
关于多进程的创建编程就是要明确记住创建子进程的父进程是哪一个