• 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
    达到想要的目的!!
    问题解决!!!!


  • 相关阅读:
    第01组 Beta冲刺(4/5)
    第01组 Beta冲刺(3/5)
    第01组 Beta冲刺(2/5)
    第01组 Beta冲刺(1/5)
    2019 SDN上机第6次作业
    2019 SDN阅读作业(2)
    2019 SDN上机第5次作业
    第01组 Alpha事后诸葛亮
    第01组 Alpha冲刺(6/6)
    团队作业第三次—项目需求分析
  • 原文地址:https://www.cnblogs.com/roger0212/p/4436735.html
Copyright © 2020-2023  润新知