当前位置:  技术问答>linux和unix

请教信号难题

    来源: 互联网  发布时间:2015-12-12

    本文导语:  在http://community.csdn.net/Expert/topic/5003/5003265.xml?temp=.6551477所说的项目中,有一个新的需求:要求做一个监控进程,当应用进程意外宕掉时能够在最短的时间内能够在最短的时间内将其重新拉起来。我的实现框架是: void...

在http://community.csdn.net/Expert/topic/5003/5003265.xml?temp=.6551477所说的项目中,有一个新的需求:要求做一个监控进程,当应用进程意外宕掉时能够在最短的时间内能够在最短的时间内将其重新拉起来。我的实现框架是:
void main()
{
...
signal ( SIGTERM , HandleExit );
        signal ( SIGCHLD , HandleChildDeath );/*检测子进程退出信号,并将其重新启动*/
        sighold ( SIGCHLD ) ; /*临时hold子进程退出信号*/
        StartAllProg () ; /*启动所有应用进程,方法为fork+exec */
        sigrelse ( SIGCHLD ) ; /*release  子进程退出信号*/
        ...
        while ( 1 )
sleep ( 600 );
}
经过测试,效果非常好!无论是子进程core dump还是kill掉子进程,这个监控进程都能立刻将其重新运行起来。
但随之而来的问题也让我非常头痛,比如下面的程序
void catch_child ( int signo )
{
pid_t llpid ;
int status;
while ( 1 )
        {
            llpid = waitpid ( (pid_t) -1 , &status , WNOHANG ) ;
            if ( llpid > 0 )
                     printf ( "catch process %d exited n" , llpid );
            else
                break;
         }
         signal ( SIGCHLD , catch_child );
}
void main( )
{
...
         signal ( SIGCHLD , catch_child );
         while ( 1 )
         {
                 sleep (1)
                 if ( fork () == 0 )
                  {
                       sleep (3 );
                       exit (0);
                  }
         }
}
这个程序单独运行时没问题。但通过我做的监控程序运行时 ,父进程就检测不到SIGCHLD信号了,从而产生了大量的僵尸进程。我跟踪过程序 signal ( SIGCHLD , catch_child )是成功的errno也为0,但根本不起作用,用signal ( SIGCHLD , SIG_IGN )也一样。我怀疑问题出在监控进程中的signal ( SIGCHLD , HandleChildDeath );上面,但不知怎么解决?请高手指教!问题解决即给分,帮顶有分!

|
子进程终止,向他的父进程发送SIGCHLD信号。
合理的安排父子关系。 监控程序只有一个儿子进程,也就是被监控程序,被监控程序的所有子进程只向他的父进程也就是被监控进程本身发送SIGCHLD信号。

|
对啊。我说就是这样啊。
子进程会终止会向父进程发送信号。子进程(我上面所说的被监控进程)终止了会给监控进程发信号。子进程创建的进程为子子进程(我上面所说的被监控进程的子进程)终止会给他的父进程(既子进程,也是我上面所说的被监控进程)发信号。
#include 
#include 
#include 
#include 
#include 

void catch_child(int signo)
{
    pid_t llpid ;
    int status;
    while ( 1 )
    {
        llpid = waitpid ( (pid_t) -1 , &status , WNOHANG ) ;
        if ( llpid > 0 )
            printf ( "%d, catch process %d exited n" , getpid(),llpid );
        else
            break;
    }
    signal ( SIGCHLD , catch_child );
}

void func()
{
    pid_t pid;

    signal (SIGCHLD, catch_child);

    pid = fork ();
    if (pid == 0)
    {
        printf("child child: pid = %dn", getpid());
        exit (0);
    }
}

int main()
{
    pid_t pid;

    signal (SIGCHLD, catch_child);

    printf("parent: pid = %dn", getpid());
    pid = fork ();
    if (pid == 0)
    {
        printf("child: pid = %dn", getpid());
        func();
        exit (0);
    }
}
parent: pid = 2250
child: pid = 2251
child child: pid = 2252
2251, catch process 2252 exited
2250, catch process 2251 exited

|
父进程注册的信号处理不会影响子进程的,同样子进程的也不会影响父进程的。
你这可能是信号排队的问题

    
 
 

您可能感兴趣的文章:

  • 有一难题请教
  • 请教一个难题:关于执行顺序。
  • 难题请教
  • linux8 上安装Oracle8.1.6的难题 ,请教
  • skyyoung(路人甲)先生,你好:我遇到一个难题,特向你请教,我用 qmail+vpopmail 做邮件服务器,怎样区分新旧邮件? 
  • 小弟刚开始学JAVA,遇到了难题,请教:
  • 遇到一个难题,请教高手!!!
  • ###请教高手:UDP scocket传输策略的难题###up有分
  • 几个有关邮件收发难题,请教各位高手!
  • 请教:多线程模式下的信号处理问题
  • 请教信号量处理函数signal的问题?
  • 请教 gtk编程,nootbook控件切换标签时信号量处理的问题
  • linux编程中简单的信号处理问题,请教各位,谢谢。
  • 请教一个关于UNIX下信号量的问题
  • 信号方面的问题请教.请大家指点
  • 初学,请教一个信号问题,这个方法不理解
  • 请教一段代码的意思,信号和超时的
  • 请教关于Kill向子进程发送信号的问题,子进程如何相应信号,为什么子进程接受不到。
  • [请教内核高手]内核在何处处理接收到的信号
  • 请教一个有关信号的问题
  • 还是不懂,驱动到底如何能同步的发送信号给用户程序,请教高人,谢谢了
  • 小白请教关于Listen、accept、信号处理函数、waitpid的几个问题
  • 请教信号发送程序遇到的一个问题
  • 请教使用sem_unlink删除信号量的问题
  • 请教关于SIGSEGV信号的问题
  • Linux内核信号量和定时器问题请教:
  • 用信号量同步出错,请教高手。。。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3