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

下面 代码主要用于复习,留于此

点击(此处)折叠或打开

  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

时间: 2024-09-25 11:39:34

LINUX C 父进程建立多个子进程循环非堵塞回收列子的相关文章

僵尸进程zombie与孤儿进程orphan

问题提出 以前在学习<unix环境高级编程>进程时候,提到孤儿进程和僵尸进程,但是一直对这两个概念比较模糊.于是今天做了一些测试程序,并把这些记录下来. 僵尸进程/僵死进程 In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie. 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / w

linux 管道 父进程写入管道的数据,其他进程没有处理怎么办?

问题描述 linux 管道 父进程写入管道的数据,其他进程没有处理怎么办? #include #include int main(void) { int n; char line[MAXLINE]; int fd[2]; pid_t pid; //create the pipe if(pipe(fd)<0) err_sys("pipe error!"); if((pid = fork()) < 0 ){ err_sys("fork error"); }

Linux进程学习(孤儿进程和守护进程)

孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程如果一个子进程的父进程先于子进程 结束, 子进程就成为一个孤儿进程,它由 init 进程收养,成为 init 进程的子进程.2.那么如何让一个进程变为一个孤儿进程呢?我们可以先创建一个进程,然后杀死其父进程,则其就变成了孤儿进程.pid =  fork();if(pid > 0) {         

Linux下C编程:“侠肝义胆”之进程

如果我们把计算机上的操作系统及各种各样的软件看成一系列的有机生命,而不是指令集,那么这就是一个进程的世界,在进程的世界中同样有"道德"和"法制法规",窥探进程世界,看它的侠肝义胆,风雨江湖路~~~~~ linux支持多个进程同时进行,也就是我们常说的现代操作系统中的多道程序设计,所谓同时是linux系统调度各个进程分别占用cpu的时间.由于每个时间片的时间很小和宏观时间相比,给人的感觉是多个进程在运行. 注:总结下就是在微观是串行,在宏观上是并行. 为了提高程序的运

linux那点事儿(六)----进程管理详解(推荐)

目录:(内容较多,加个目录) |-进程管理  进程常用命令 |- w查看当前系统信息 |- ps进程查看命令 |- kill终止进程 |- 一个存放内存中的特殊目录/proc |- 进程的优先级 |- 进程的挂起与恢复 |- 通过top命令查看进程 计划任务 |- 计划任务的重要性 |- 一次性计划at和batch |- 周期性计划crontab 进程管理的概念                                                                    

linux系统编程之进程(一) 进程概述

一.什么是进程 从用户的角度来看进程是程序的一次执行过程. 从操作系统的核心来看,进程是操作系统分配的内存.CPU时间片等资源的基本单位. 进程是资源分配的最小单位. 每一个进程都有自己独立的地址空间与执行状态. 像UNIX这样的多任务操作系统能够让许多程序同时运行,每一个运行着的程序就构成了一个进程. 二.进程数据结构 进程的静态描述:由三部分组成:PCB.有关程序段和该程序段对其进行操作的数据结构集. 进程控制块:用于描述进程情况及控制进程运行所需的全部信息. 代码段:是进程中能被进程调度程

Linux下如何知道文件被那个进程写

本文链接地址: Linux下如何知道文件被那个进程写 一个问题:(想想能解决不?) "一个文件正在被进程写 我想查看这个进程 文件一直在增大 找不到谁在写 使用lsof也没找到" 这个问题挺有普遍性的,解决方法应该很多,这里我给大家提个比较直观的方法. linux下每个文件都会在某个块设备上存放,当然也都有相应的inode, 那么透过vfs.write我们就可以知道谁在不停的写入特定的设备上的inode. 幸运的是systemtap的安装包里带了inodewatch.stp,位于/us

怎么建立多个子窗体?并把父窗体内的listbox想中的值传递到各个子窗体的listbox?

问题描述 怎么建立多个子窗体?并把父窗体内的listbox想中的值传递到各个子窗体的listbox? 解决方案 解决方案二:为什么会有这样的逻辑,应该是子窗体往父窗体传值才对,不过你要是想那样,可以参考一下parent.解决方案三:你的父窗体的IsMdiContainer=true,然后你的子窗体的MdiParent=父窗体,就行了,至于传值方法很多,你可以把父窗体的listbox作为参数在new子窗体时传过去就行了.解决方案四:MdiParent在哪里啊?也是属性?怎么用啊?

linux下某程序中实现对进程的实时流量监控功能

问题描述 linux下某程序中实现对进程的实时流量监控功能 求大牛赐教 现在开发了一个程序,在linux下跑,想在里面加一个对特定进程的网络流量监控,实时统计进程流量大小 现在想到的办法就是用libpcap库,对应/proc里面文件按照pid 端口号 数据包 数据大小 进行统计得出当前流量大小. 目前有如下问题: 1.程序中已有功能中已经使用了libpcap去抓去一段数据包然后输出libpcap文件,如果按照上述办法,会不会造成再用libpcap采集数据包出问题?或者说libpcap可不可以多次