博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编写多进程编程
阅读量:5101 次
发布时间:2019-06-13

本文共 3590 字,大约阅读时间需要 11 分钟。

实验内容:有3个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一个子进程运行"ls -l"指令,另一个子进程暂停5s之后异常退出,父进程先用阻塞方式等待第一子进程的结束,然后用非阻塞方式等待另一个子进程退出,等待收集到第二个子进程结束的信息,父进程就返回。

/* multi_proc.c */#include 
#include
#include
#include
#include
int main(void){ pid_t child1, child2, child; /*创建两个子进程*/ child1 = fork(); /*子进程1的出错处理*/ if (child1 == -1) { printf("Child1 fork error\n"); exit(1); } else if (child1 == 0) /*在子进程1中调用execlp()函数*/ { printf("In child1: execute 'ls -l'\n"); if (execlp("ls", "ls", "-l", NULL) < 0) { printf("Child1 execlp error\n"); } } else /*在父进程中再创建进程2,然后等待两个子进程的退出*/ { child2 = fork(); if (child2 == -1) /*子进程2的出错处理*/ { printf("Child2 fork error\n"); exit(1); } else if(child2 == 0) /*在子进程2中使其暂停5s*/ { printf("In child2: sleep for 5 seconds and then exit\n"); sleep(5); exit(0); } printf("In father process:\n"); child = waitpid(child1, NULL, 0); /* 阻塞式等待 */ if (child == child1) { printf("Get child1 exit code\n"); } else { printf("Error occured!\n"); } do { child = waitpid(child2, NULL, WNOHANG);/* 非阻塞式等待 */ if (child == 0) { printf("The child2 process has not exited!\n"); sleep(1); } } while (child == 0); if (child == child2) { printf("Get child2 exit code\n"); } else { printf("Error occured!\n"); } } return 0;}

 第二种代码写法:

/* 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("Child1 fork error\n"); exit(1); } else if (child1 == 0) /*在子进程1中调用execlp()函数*/ { printf("In child1: execute 'ls -l'\n"); if (execlp("ls", "ls", "-l", NULL) < 0) { printf("Child1 execlp error\n"); } } if (child2 == -1) /*子进程2的出错处理*/ { printf("Child2 fork error\n"); exit(1); } else if( child2 == 0 ) /*在子进程2中使其暂停5s*/ { printf("In child2: sleep for 5 seconds and then exit\n"); sleep(5); exit(0); } else /*在父进程中等待两个子进程的退出*/ { printf("In father process:\n"); child = waitpid(child1, NULL, 0); /* 阻塞式等待 */ if (child == child1) { printf("Get child1 exit code\n"); } else { printf("Error occured!\n"); } do { child = waitpid(child2, NULL, WNOHANG);/* 非阻塞式等待 */ if (child == 0) { printf("The child2 process has not exited!\n"); sleep(1); } } while (child == 0); if (child == child2) { printf("Get child2 exit code\n"); } else { printf("Error occured!\n"); } } return 0;}

 

转载于:https://www.cnblogs.com/yihujiu/p/5615198.html

你可能感兴趣的文章
dubbo 配置文件详解
查看>>
创建Docker私有仓库
查看>>
前端开发利器 - WebStorm
查看>>
[原创]java WEB学习笔记91:Hibernate学习之路-- -HQL 迫切左外连接,左外连接,迫切内连接,内连接,关联级别运行时的检索策略 比较。理论,在于理解...
查看>>
上传图片并实现本地预览(1)
查看>>
C# 下载
查看>>
windows 系统新建 vue 项目的坑
查看>>
c#线程1
查看>>
使用docker部署skywalking
查看>>
如何设计自动化测试的代码结构
查看>>
样本打散后计算单特征 NDCG
查看>>
el表达式
查看>>
453. Minimum Moves to Equal Array Elements 一次改2个数,变成统一的
查看>>
过年要回家,随手写了个12306买票的脚本,成功抢到几张卧铺.
查看>>
Linux关机命令详解
查看>>
【基础最小生成树】Jungle Roads
查看>>
HDU 1087 Super Jumping! Jumping! Jumping!(DP)
查看>>
Spring Boot 依赖包讲解
查看>>
C++类成员空间分配和虚函数表
查看>>
关于微信隐藏分享按钮的心得
查看>>