Simple Signals - C programming and alarm function

后端 未结 4 1522
挽巷
挽巷 2020-12-01 04:39
#include  
#include  


void  ALARMhandler(int sig)
{
  signal(SIGALRM, SIG_IGN);          /* ignore this signal       */
  printf(\"H         


        
相关标签:
4条回答
  • 2020-12-01 05:12

    You're not setting the handler in your main function.

    Before you do alarm(2), put the signal(SIGALRM, ALARMhandler); in your main.

    It should work then.

    Note that your "All Done" will never be printed, because you'll stay in the while(1) loop after the signal processor has run. If you want the loop to be broken, you'll need to have a flag that the signal handler changes.

    #include <stdio.h>
    #include <signal.h>
    #include <unistd.h>
    
    /* number of times the handle will run: */
    volatile int breakflag = 3;
    
    void handle(int sig) {
        printf("Hello\n");
        --breakflag;
        alarm(1);
    }
    
    int main() {
        signal(SIGALRM, handle);
        alarm(1);
        while(breakflag) { sleep(1); }
        printf("done\n");
        return 0;
    }
    
    0 讨论(0)
  • 2020-12-01 05:13

    You are not installing the signal handler first.
    You need to tell the system that you want to handle the signal before actually receiving it, so you need to call signal() from main before the signal comes.

    int main(int argc, char *argv[])
    {
      signal(SIGALRM, ALARMhandler);     /* install the handler    */
      alarm(2);                     /* set alarm clock          */
      while (1);
    }
    
    0 讨论(0)
  • 2020-12-01 05:14

    You're forgetting to set the alarm handler initially. Change the start of main() like:

    int main(int argc, char *argv[])
    {
       signal(SIGALRM, ALARMhandler);
       ...
    

    Also, the signal handler will probably print nothing. That's because the C library caches output until it sees an end of line. So:

    void  ALARMhandler(int sig)
    {
      signal(SIGALRM, SIG_IGN);          /* ignore this signal       */
      printf("Hello\n");
      signal(SIGALRM, ALARMhandler);     /* reinstall the handler    */
    }
    

    For a real-world program, printing from a signal handler is not very safe. A signal handler should do as little as it can, preferably only setting a flag here or there. And the flag should be declared volatile.

    0 讨论(0)
  • 2020-12-01 05:18

    Andomar is rigth. I test this and, version 1 prints (every second):

    Hi...
    Hi...
    Hi...
    Hi...
    BYE
    Hi...
    ...
    

    version 2 prints (every five seconds):

    Hi...Hi...Hi...Hi...BYE
    Hi...Hi...Hi...Hi...BYE
    ...
    

    So the code is:

    #include <stdio.h>
    #include <unistd.h>
    #include <signal.h>
    
    # define T 5
    
    int flag = T;
    
    void sigalrm_handler(int);
    
    int  main(void)
    {
        signal(SIGALRM, sigalrm_handler);   
        alarm(1);                         
        while (1);  
    }
    
    void sigalrm_handler(int sig)
    {
        if(--flag){
            printf("Hi...\n");   /*version 1*/
            /*printf("Hi...");*/ /*version 2*/
        }else{
            printf("BYE\n");
            flag=T;     
        }
        alarm(1);
    }
    
    0 讨论(0)
提交回复
热议问题