LINUX C 父进程建立多个子进程循环非堵塞回收列子

简介: 下面 代码主要用于复习,留于此 点击(此处)折叠或打开 /*************************************************************************   > File Name: fork5.
下面 代码主要用于复习,留于此

点击(此处)折叠或打开

  1. /*************************************************************************
  2.   > File Name: fork5.c
  3.   > Author: gaopeng QQ:22389860 all right reserved
  4.   > Mail: gaopp_200217@163.com
  5.   > Created Time: Sun 02 Jul 2017 02:39:16 AM CST
  6.  ************************************************************************/

  7. #include<stdio.h>
  8. #include<unistd.h>
  9. #include <stdlib.h>
  10. #define MAXPNUM 3

  11. typedef struct handler
  12. {
  13.         int* pidarr;
  14.         int childnum;
  15. } HANDLER;

  16. int main(void)
  17. {
  18.         int i = 0;
  19.         int m = 0;
  20.         int psre = 0;
  21.         HANDLER pidhd;

  22.         pidhd.pidarr = (int*)calloc(MAXPNUM+1,sizeof(int));//初始化内存
  23.         pidhd.childnum = 0;//初始化进程数量



  24.         for(i = 0 ;i<MAXPNUM;i++)//循环建立
  25.         {
  26.                 m = fork();
  27.                 if(m == -1)
  28.                 {
  29.                         perror("fork:");
  30.                 }
  31.                 else if( m == 0 )
  32.                 {
  33.                         printf("CHILD: I is child process pid: %d parent process pid: %d \n",getpid(),getppid());
  34.                         sleep(60);
  35.                         break;
  36.                 }
  37.                 else
  38.                 {
  39.                         sleep(1);
  40.                         pidhd.childnum ++;//进程num+1
  41.                         *(pidhd.pidarr+i) = m;//指针移动+1
  42.                         printf("PARENT: I is parent process pid: %d i fock chlid pid: %d \n",getpid(),m);
  43.                 }
  44.         }

  45.         if(i == MAXPNUM)//一定为父进程
  46.         {
  47.                 for(i=0;*(pidhd.pidarr+i);i++)
  48.                 {
  49.                         printf("child process is pid:%d\n",*(pidhd.pidarr+i));
  50.                 }
  51.         }

  52.         if(i == MAXPNUM)//一定为父进程
  53.         {
  54.                 printf("parent pid %d fock child process number is %d finsh!! \n",getpid(),pidhd.childnum);
  55.                 while(pidhd.childnum > 0)
  56.                 {
  57.                         for(i = 0;i< MAXPNUM ;i++) //WNOHANG非堵塞循环回收
  58.                         {
  59.                                 if(*(pidhd.pidarr+i) != 0 && waitpid(*(pidhd.pidarr+i),&psre,WNOHANG) > 0 )
  60.                                 {
  61.                                         if (WIFEXITED(psre))//是否正常退出获取其退出值
  62.                                                 printf("child %d exit %d\n", *(pidhd.pidarr+i), WEXITSTATUS(psre));
  63.                                         else if (WIFSIGNALED(psre))//是否异常退出信号终止获得信号值
  64.                                                 printf("child %d cancel signal %d\n", *(pidhd.pidarr+i), WTERMSIG(psre));
  65.                                         *(pidhd.pidarr+i) == 0;
  66.                                         pidhd.childnum--;
  67.                                         break;
  68.                                 }
  69.                         }
  70.                 }
  71.           free(pidhd.pidarr);
  72.         }
  73.         return 1;//子进程父进程均已return 1 退出
  74. }
输出如下可以捕获子线程由于kill 发信号终止:
▽aopeng@bogon:~/linux0411/process$ ./a.out   
CHILD: I is child process pid: 2588 parent process pid: 2587
PARENT: I is parent process pid: 2587 i fock chlid pid: 2588
CHILD: I is child process pid: 2589 parent process pid: 2587
PARENT: I is parent process pid: 2587 i fock chlid pid: 2589
CHILD: I is child process pid: 2590 parent process pid: 2587
PARENT: I is parent process pid: 2587 i fock chlid pid: 2590
child process is pid:2588
child process is pid:2589
child process is pid:2590
parent pid 2587 fock child process number is 3 finsh!!
child 2588 cancel signal 9
child 2589 cancel signal 15
child 2590 cancel signal 11
可以捕获正常终止
gaopeng@bogon:~/linux0411/process$ ./a.out
CHILD: I is child process pid: 2597 parent process pid: 2596
PARENT: I is parent process pid: 2596 i fock chlid pid: 2597
CHILD: I is child process pid: 2598 parent process pid: 2596
PARENT: I is parent process pid: 2596 i fock chlid pid: 2598
CHILD: I is child process pid: 2599 parent process pid: 2596
PARENT: I is parent process pid: 2596 i fock chlid pid: 2599
child process is pid:2597
child process is pid:2598
child process is pid:2599
parent pid 2596 fock child process number is 3 finsh!!
child 2599 cancel signal 1
child 2597 exit 1
child 2598 exit 1
相关文章
|
16天前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
48 4
linux进程管理万字详解!!!
|
6天前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
43 8
|
15天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
49 4
|
16天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
18天前
|
消息中间件 存储 Linux
|
24天前
|
运维 Linux
Linux查找占用的端口,并杀死进程的简单方法
通过上述步骤和命令,您能够迅速识别并根据实际情况管理Linux系统中占用特定端口的进程。为了获得更全面的服务器管理技巧和解决方案,提供了丰富的资源和专业服务,是您提升运维技能的理想选择。
26 1
|
1月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
【10月更文挑战第9天】本文将深入浅出地介绍Linux系统中的进程管理机制,包括进程的概念、状态、调度以及如何在Linux环境下进行进程控制。我们将通过直观的语言和生动的比喻,让读者轻松掌握这一核心概念。文章不仅适合初学者构建基础,也能帮助有经验的用户加深对进程管理的理解。
22 1
|
1月前
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
30 0
Linux c/c++之IPC进程间通信
|
1月前
|
Linux C++
Linux c/c++进程间通信(1)
这篇文章介绍了Linux下C/C++进程间通信的几种方式,包括普通文件、文件映射虚拟内存、管道通信(FIFO),并提供了示例代码和标准输入输出设备的应用。
26 0
Linux c/c++进程间通信(1)
|
1月前
|
Linux C++
Linux c/c++进程之僵尸进程和守护进程
这篇文章介绍了Linux系统中僵尸进程和守护进程的概念、产生原因、解决方法以及如何创建守护进程。
21 0