子进程崩溃父进程如何得知并重启子进程

发布时间:2010-11-30 16:00:14来源:红联作者:skywing

大家好,我有一个程序,主进程中fork出两个进程,子进程循环执行任务, 我想做一个控制,在子进程崩溃时,让父进程获取子进程一个信号,并重启一个子进程,保证一直有两个子进程在工作。

我使用了signal(SIGCLD, sig_process);

sig_process函数如下:

static void sig_process(int signum)

{

int pid_t,pstatus,acsid;

switch( signum )

{

case SIGCHLD:

pid_t = wait( &pstatus );

if(pid_t > 0)

{

for( acsid = 1 ; acsid <= SHMINFO->EPOLLNUM ;acsid++ )

{

printf("SHMINFO->SU_EPOLLS[%d-1].pid=%d,pid_t=%d\n",acsid,SHMINFO->SU_EPOLLS[acsid-1].pid,pid_t);

if( SHMINFO->SU_EPOLLS[acsid-1].pid == pid_t )

{

printf("set the acs%d state\n",acsid);

P_Action(SEM_I_ID, 0);

SHMINFO->SU_EPOLLS[acsid-1].state = 4;

V_Action(SEM_I_ID, 0);

printf("set the acs%d state end\n",acsid);

siglongjmp(env_startacs, 1);//跳转至先前的setjmp处

}

}

}

break;

}

}

在父进程中有一个循环去重启子进程:

while(1)

{

if( sigsetjmp(env_startacs, 1) == 0 ) //设置记号

{

printf("setjmp ok.....\n");

}

else

{

printf("longjmp ok.....\n");

}

printf("start wait.....\n");

signal(SIGCLD, sig_process); //子进程出错处理

for( acsid = 1 ; acsid <= epnum ;acsid++ )

{

//printf("circle acsid=%d\n",acsid);

if( SHMINFO->SU_EPOLLS[acsid-1].state == 4 )

{

printf("start_acsserver_worker acsid=%d \n",acsid);

start_acsserver_worker( argc , argv , envp , acsid , listenfd );

}

}

}

但是signal(SIGCLD, sig_process); //子进程出错处理 ,到这行就不会往下跑了

linux子进程崩溃父进程如何得知并重启子进程,子进程崩溃父进程如何得知并重启子进程...相关推荐

  1. 【linux】使用systemctl start xxx启动自己的程序|开机启动|守护进程

    目录 即看即用 详细说明 systemctl 的用途 用法 例子:以管理我们的程序verdaccio为例 开机启动 设置程序开机启动.关闭.启用/禁用服务以vsftpd为例 三个部分[Unit].[S ...

  2. php linux fork进程 多个进程/线程共享一个 socket连接 出现多个进程响应串联

    简单说来就是:因为fork,父子进程共享了一个redis连接.然后父子进程在发送了各自的redis请求分别获取到了对方的响应体. 复现示例代码: testFork.php <?php requi ...

  3. linux孤儿进程组深入理解,unix基础---有关于孤儿进程组和终端会话的理解-------值得一看!!!...

    转载自http://xingyunbaijunwei.blog.163.com/blog/static/765380672011112633634628/ 孤儿进程: 即一个其父进程已经终止的进程.  ...

  4. Linux下QProcess不产生finished信号、waitforfinished阻塞超时【defunct进程】

    文章目录 项目场景: 问题描述以及分析过程: defunct(僵尸进程): QProcess的实现: 理论原因: 尝试修改一: 第一次痛定思痛: 尝试修改二: 第二次修改能满足要求: 使用startd ...

  5. Linux进程调用execve,实验:从整理上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和...

    学号375 转载请注明出处 https://github.com/mengning/linuxkernel/ 阅读理解task_struct数据结构 task_struct实际上就是进程PCB以下是p ...

  6. Linux ——进程的虚拟地址空间,逻辑地址和物理地址,进程管理命令

    进程的虚拟地址空间 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,虚拟地址空间的大小由计算机的硬件平台决定,比如32位的平台决定了虚拟地址空间为4G(因为32位系统上指针能够寻址 ...

  7. Linux编程基础学习2.2:文件操作、3.1:进程管理-1

    文件操作函数 1.stat函数 用于获取文件属性,包括文件的文件名.文件大小.文件类型等等 #include <sys/stat.h> int stat(const char *path, ...

  8. Linux操作系统:操作系统与进程之fork、相关状态、僵尸进程

    文章目录 操作系统 什么是操作系统 操作系统如何管理 系统调用和库函数概念 为什么需要操作系统 进程 进程的概念 如何管理进程 一.描述 二.PCB 三.task_struct 进程相关操作 一.查看 ...

  9. linux僵尸进程产生的原因以及如何避免产生僵尸进程defunct

    给进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取.这些信息包括子进程的进程ID.终止状态以及资源利用信息(CPU时间,内存使用量等等).如果一个进程终止,而该进程有子进程处于僵 ...

  10. linux僵尸进程产生的原因以及如何避免产生僵尸进程

    给进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取.这些信息包括子进程的进程ID.终止状态以及资源利用信息(CPU时间,内存使用量等等).如果一个进程终止,而该进程有子进程处于僵 ...

最新文章

  1. 恢复SQL Server被误删除的数据
  2. week06 codelab02
  3. mPaas-RPC拦截器各种场景下的使用指南
  4. 1051. 复数乘法 (15)
  5. C++多态面试题汇总
  6. ShardingSphere(三) 水平分库配置搭建,实现写入读取
  7. 解读8大场景下Kunpeng BoostKit 使能套件的最佳能力和实践
  8. tp5 前台页面获取url链接里的参数,如下
  9. bzoj千题计划141:bzoj3532: [Sdoi2014]Lis
  10. MongoDBTool - 测试版【GUI美化完毕】 源代码发布 --MongoDB爱好者,Winform爱好者 请进...
  11. python可以处理哪些文件_Python(文件处理)
  12. HDU6278 Just h-index
  13. 常用iOS游戏开发工具与SDK
  14. leetcode 226 Invert Binary Tree 翻转二叉树
  15. java numberformat 方法_java.text.NumberFormat使用方法
  16. RTL8111E datasheet中提到的术语
  17. 粘贴板管理 android,复制粘贴神器(剪贴板管理)app
  18. php 正则 标点符号,js正则匹配中文标点符号
  19. lzw编码c语言,LZW字典压缩算法的实现
  20. 型のデザインのガイドライン

热门文章

  1. 在Ubuntu中安裝Anaconda
  2. warning: pointer targets in passing argument 3 of ‘accept’ differ in signedness
  3. VCN中文编程平台的优势(二)——产品的价格
  4. 推荐:mysql锁 innodb下的记录锁,间隙锁,next-key锁
  5. 跨行入测绘,看航测小白如何实现纯免相控作业
  6. 系统集成项目应怎样管?本文经验值得借鉴
  7. 计算机画图怎么画荷花图片简笔画,画荷花最简单的画法 荷花画图片简单画法...
  8. es linux下使用api进行es故障操作处理
  9. MySQL中show命令用法大全
  10. 仿网易云音乐的滑动冲突处理效果