zoukankan      html  css  js  c++  java
  • SIGPROF和SIGALRM使用总结

          这几天,被公司的两个模块的程序好好的搞了一下,开始以为是SHELL的问题,仔细研究了以下,原来没有想象的那么复杂!!!
          关键在使用的信号SIGALRM 上,两个进程都用可SIGALRM 信号,一个进程在处理函数上启动了另一个进程,导致发给被启动进程的SIGALRM 被屏蔽掉了,最后的结果是被启动进程不能正常运行!!!!
         查了查书,发现还有个SIGPROF,呵呵.打算用SIGPROF来作为一个进程的信号,先写个测试程序看看管不管用


    sigprof.c代码如下:
    #include <stdio.h>
    #include <math.h>
    #include <sys/time.h>
    #include <signal.h>
    #include <unistd.h>
    void prompt_info(int signo)
    {
    printf("can i be called!!!
    ");
    system("./test");
    }
    void init_sigaction(void)
    {
    struct sigaction act;
    act.sa_handler=prompt_info;
    act.sa_flags=0;
    sigemptyset(&act.sa_mask);
    sigaction(SIGPROF,&act,NULL);
    }
    void init_time()
    {
    struct itimerval value;
    value.it_value.tv_sec=2;
    value.it_value.tv_usec=0;
    value.it_interval=value.it_value;
    setitimer(ITIMER_PROF,&value,NULL);
    }
    int main()
    {
    init_sigaction();
    init_time();
    while(1);
    exit(0);
    }
    在RED HAT 9.0下编译
    gcc -o sigprof sigprof.c
    test.c的代码如下:
    #include <stdio.h>
    #include <math.h>
    #include <sys/time.h>
    #include <signal.h>
    #include <unistd.h>
    void prompt_info()
    {
      //system("./sigprof");
     printf("this is a test!!!!!!
    ");
    }
    void init_sigaction(void)
    {
    struct sigaction act;
    act.sa_handler=prompt_info;
    act.sa_flags=0;
    sigemptyset(&act.sa_mask);
    sigaction(SIGALRM,&act,NULL);
    }
    void init_time()
    {
    struct itimerval value;
    value.it_value.tv_sec=20;
    value.it_value.tv_usec=0;
    value.it_interval=value.it_value;
    setitimer(ITIMER_REAL,&value,NULL);
    }
    int main()
    {
    init_sigaction();
    init_time();
    while(1);
    exit(0);
    }
    在RED HAT 9.0下编译
    gcc -o test test.c
    运行./sigprof
    结果如下:
    can i be called!!!
    this is a test!!!!!!
    this is a test!!!!!!
    this is a test!!!!!!
    this is a test!!!!!!
    this is a test!!!!!!
    this is a test!!!!!!
    this is a test!!!!!!
    this is a test!!!!!!
    this is a test!!!!!!
    this is a test!!!!!!
    this is a test!!!!!!
    看来信号还是被屏蔽掉了!!!!
     
    两者的关系对调一下:
     
      sigprof.c代码如下:
    #include <stdio.h>
    #include <math.h>
    #include <sys/time.h>
    #include <signal.h>
    #include <unistd.h>
    void prompt_info(int signo)
    {
    printf("can i be called!!!
    ");
    //system("./test");
    }
    void init_sigaction(void)
    {
    struct sigaction act;
    act.sa_handler=prompt_info;
    act.sa_flags=0;
    sigemptyset(&act.sa_mask);
    sigaction(SIGPROF,&act,NULL);
    }
    void init_time()
    {
    struct itimerval value;
    value.it_value.tv_sec=2;
    value.it_value.tv_usec=0;
    value.it_interval=value.it_value;
    setitimer(ITIMER_PROF,&value,NULL);
    }
    int main()
    {
    init_sigaction();
    init_time();
    while(1);
    exit(0);
    }
    在RED HAT 9.0下编译
    gcc -o sigprof sigprof.c
    test.c的代码如下:
    #include <stdio.h>
    #include <math.h>
    #include <sys/time.h>
    #include <signal.h>
    #include <unistd.h>
    void prompt_info()
    {
     system("./sigprof");
     printf("this is a test!!!!!!
    ");
    }
    void init_sigaction(void)
    {
    struct sigaction act;
    act.sa_handler=prompt_info;
    act.sa_flags=0;
    sigemptyset(&act.sa_mask);
    sigaction(SIGALRM,&act,NULL);
    }
    void init_time()
    {
    struct itimerval value;
    value.it_value.tv_sec=20;
    value.it_value.tv_usec=0;
    value.it_interval=value.it_value;
    setitimer(ITIMER_REAL,&value,NULL);
    }
    int main()
    {
    init_sigaction();
    init_time();
    while(1);
    exit(0);
    }
    在RED HAT 9.0下编译
    gcc -o test test.c
    
    运行./test
    can i be called!!!
    can i be called!!!
    can i be called!!!
    can i be called!!!
    can i be called!!!
    can i be called!!!
    can i be called!!!
    can i be called!!!
    can i be called!!!
    can i be called!!!
    can i be called!!!
    can i be called!!!
    can i be called!!!
    can i be called!!!
    can i be called!!!
    can i be called!!!
    还是失败!!!!!!
    换个思维,不在处理函数启动另一个进程
    #include <stdio.h>
    #include <math.h>
    #include <sys/time.h>
    #include <signal.h>
    #include <unistd.h>
    int i=0;
    void prompt_info()
    {
      i++;
     //system("./sigprof");
     printf("this is a test!!!!!!
    ");
    }
    void init_sigaction(void)
    {
    struct sigaction act;
    act.sa_handler=prompt_info;
    act.sa_flags=0;
    sigemptyset(&act.sa_mask);
    sigaction(SIGALRM,&act,NULL);
    }
    void init_time()
    {
    struct itimerval value;
    value.it_value.tv_sec=2;
    value.it_value.tv_usec=0;
    value.it_interval=value.it_value;
    setitimer(ITIMER_REAL,&value,NULL);
    }
    int main()
    {
    init_sigaction();
    init_time();
    while(1)
    {
     if(i==1)
     
     system("./sigprof");
    };
    exit(0);
    }
    在RED HAT 9.0下编译
    gcc -o test test.c
    
    运行./test
    结果:
    this is a test!!!!!!
    this is a test!!!!!!
    can i be called!!!
    this is a test!!!!!!
    can i be called!!!
    this is a test!!!!!!
    can i be called!!!
    this is a test!!!!!!
    can i be called!!!
    this is a test!!!!!!
    can i be called!!!
    this is a test!!!!!!
    can i be called!!!
    this is a test!!!!!!
      
    OK
    达到想要的目的!!
    问题解决!!!!


  • 相关阅读:
    【转】网络字节序与主机字节序
    VC之美化界面篇 (转)
    VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题(转)
    符验手记
    一友人昨夜接到电话,发生何事
    [转]众VC论道IT峰会:投资是否靠运气
    路过一个小摊,看到一个有趣的现象
    PJSUA提示要注册线程的解决办法
    彩票股票金融与运气之研究(五) 明敌
    随手测一局婚姻,留验
  • 原文地址:https://www.cnblogs.com/roger0212/p/4436735.html
Copyright © 2011-2022 走看看