wait_pid代码分析
来源:互联网 发布:iosselect.js api 编辑:程序博客网 时间:2024/06/10 03:23
以下代码为网上的一段代码,注释是我自己加的,正确与否,若有异议,坑请赐教
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#include <sys/wait.h>void die(const char *msg)//创建失败,则打印错误信息{ perror(msg); exit(1);//exit(0)代表正常退出,exit(1)代表错误退出}void child2_do(){ printf("In child2: execute 'date'\n"); sleep(5);//睡眠5秒,让其他进程执行 if (execlp("date", "date", NULL) < 0)//终端执行date,打印时间信息 { perror("child2 execlp"); }}void child1_do(pid_t child2, char *argv){ pid_t pw; do { if (*argv == '1') { pw = waitpid(child2, NULL, 0); } else { pw = waitpid(child2, NULL, WNOHANG);//如果子进程2没有终止,则立即返回 } if (pw == 0) //pw等于0时说明进程2没有退出,pw不等于0时,说明进程2已经退出 { printf("In child1 process:\nThe child2 process has not exited!\n"); sleep(1); } }while (pw == 0); if (pw == child2) //进程2正常退出时,则在终端显示进程2的pid,并执行pwd { printf("Get child2 %d.\n", pw); sleep(5); if (execlp("pwd", "pwd", NULL) < 0) { perror("child1 execlp"); } } else { printf("error occured!\n"); }}void father_do(pid_t child1, char *argv){ pid_t pw; do { if (*argv == '1') { pw = waitpid(child1, NULL, 0); } else { pw = waitpid(child1, NULL, WNOHANG); } if (pw == 0) { printf("In father process:\nThe child1 process has not exited.\n"); sleep(1); } }while (pw == 0); if (pw == child1) { printf("Get child1 %d.\n", pw); if (execlp("ls", "ls", "-l", NULL) < 0) { perror("father execlp"); } } else { printf("error occured!\n"); }}int main(int argc, char *argv[]){ pid_t child1, child2; if (argc < 3)//如果输入的参数少于3个,则打印如下信息 { printf("Usage: waitpid [0 1] [0 1]\n"); exit(1); } child1 = fork();//创建子进程1 if (child1 < 0) { die("child1 fork"); } else if (child1 == 0) { child2 = fork();//在子进程child1中再次创建一个子进程child2 if (child2 < 0) { die("child2 fork"); } else if (child2 == 0) { child2_do();//检验如果创建的child2的pid==0,则执行child2_do(); } else //检验如果创建的child2的pid!=0,则执行child1_do(); { child1_do(child2, argv[1]);//注意:输入参数为进程2的pid,argv[1] } } else//如果是父进程,则执行father_do { father_do(child1, argv[2]); } return 0;}终端上执行的结果明天在给出,现在太晚了,要睡了
0 0
- wait_pid代码分析
- wait和 wait_pid函数用法
- 分析代码
- 代码分析
- 分析代码
- 代码分析
- 分析代码
- 代码分析
- 代码分析
- 代码分析
- butterknife源码分析:代码分析
- Bittorrent 精彩代码分析
- Duwamish代码分析篇
- 井字棋游戏 代码分析
- VC6启动代码分析
- Duwamish代码分析篇
- 定时器代码分析
- Duwamish -- 代码分析篇
- 问题,sublime在python上面,为什么input不能用
- 2017网易C++笔试:将构造函数补充完整
- java--JAXP对xml文档的解析
- selenium自动化测试资源整理(含所有版本chrome、chromedriver、firefox下载链接)
- leetcode Odd Even Linked List
- wait_pid代码分析
- 用jquery生成二级菜单的实例代码
- Python 五点搞定作用域
- axure是个啥
- 【WP】Json抓包
- Pycharm之小白使用教程
- PHP读取XML
- 详解javascript的【6种数据类型】
- Leetcode 11. Container With Most Water (Medium) (java)