Catching SIGINT signal to terminate a custom shell

前端 未结 3 1132
被撕碎了的回忆
被撕碎了的回忆 2021-01-25 02:37

Hope you can help me to resolve this problem.

For school I have to transform Ctrl+C to a command which doesn\'t shut down the shell, but he reminds through

相关标签:
3条回答
  • 2021-01-25 02:49

    Ctrl+C sends an interrupt signal (SIGINT) to the running process.You can use signal() to catch SIGINT like this:

     #include<stdio.h>
     #include<signal.h>
    
     void sigint_handler(int sig)
     {
       printf("Type exit to close the shell!\n");
     }
    
    
      int main()
      {
        signal(SIGINT, sigint_handler);
    
        /*Your code should replace the while loop.*/
        while(1)
        {
            printf("Running!\n");
            getchar();
        }
    
        return 0 ;
      }
    
    0 讨论(0)
  • 2021-01-25 03:02

    As you're talking about doing it from the shell, you probably want:

    $ trap "echo Please type \'exit\' to close the shell." SIGINT
    <Ctrl-C>
    Please type 'exit' to close the shell.
    $
    

    This specifies a command to execute when the listed signal is trapped (the trap command can also trap other signals; SIGINT is the one generated by Ctrl-C). The \' protects the quote from being interpreted by the shell.

    0 讨论(0)
  • 2021-01-25 03:10

    Here's a trivial implementation of handling SIGINT using sigaction which will work on posix systems. Left out error checking for brevity. The linked manual should explain about sigaction.

    Basically the program loops through an infinite loop and break if user types exit. Using write as you can't use printf in signal handler. See signal manual for a list of functions that can be used safely in a signal handler.

    #include<stdio.h>
    #include<signal.h>
    #include<string.h>
    #include<stdlib.h>
    
    char s[]="Type 'exit' to terminate\n";
    
    void int_handler (int signum)
    {
      write(fileno(stdin), s, sizeof s - 1);
    }
    
    int main (void)
    {
      char str[256];
      struct sigaction sh;
    
      sh.sa_handler = int_handler;
      sigemptyset (&sh.sa_mask);
      sh.sa_flags = 0;
      sigaction (SIGINT, &sh, NULL);
      printf("%s", s);
    
      while(1) {
        fgets(str, sizeof str, stdin);
        char *p = strchr(str, '\n');
        if(p) *p = 0;
        if(!strcmp(str, "exit")) {
          printf("Exiting on request...");
          break;
        }
      }
      return 0;
    }
    
    0 讨论(0)
提交回复
热议问题