编写多进程程序,掌握fork()、exec()、wait()和waitpid()等函数的使用,进一步理解在Linux中多进程编程的步骤,
要求: 程序有3 个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一个子进程运行“ls -l”指令,另一个子进程在暂停5s 之后异常退出,父进程先用阻塞方式等待第一个子进程的结束,然后用非阻塞方式等待另一个子进程的退出,待收集到第二个子进程结束的信息,父进程就返回;
源代码如下:
#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);
}
运行结果截图: