【C/C++】C语言signal信号|软中断信号|程序捕获Ctrl+C 信号

目录

程序捕获Ctrl+C 信号

软中断信号

signal(SIGCHLD, SIG_IGN)

SIGCHLD信号

SIG_ING

使用signal(SIGCHLD, SIG_IGN)处理僵尸进程


程序捕获Ctrl+C 信号

在Linux下面写一个程序,如果程序中出现死循环的话,我们就应该在键盘上按Ctrl+C来终止我们的程序,那么我们也可以取捕获这个信号,然后执行我们自己的信号处理程序,输出一些有用的信息来帮助我们调试程序。信号和中断很像,我们既可以使用OS的中断处理程序,也可以截获中断执行自己的中断处理程序。下面是一个多线程的例子:

#include 
#include 
#include 
#include 
#include 

#define true 1

void *One(void *no) 
{
      while (true)
          {
          printf("NUAACS1\n");
          sleep(1);
         
    }
}

void *Two(void *no) ?
{
      while (true)
          {
          printf("NUAACS2\n");
          sleep(1);
         
    }
}

void Stop(int signo) 
{
      printf("oops! stop!!!\n");
      _exit(0);
}

int main()
{
      int res;
      pthread_t A, B;

      signal(SIGINT, Stop);
    
      res = pthread_create(&A, NULL, One, NULL);
      res = pthread_create(&B, NULL, Two, NULL);
      res = pthread_join(A, NULL);
      res = pthread_join(B, NULL);

      return 0;
}

编译上述程序的命令:gcc nuaa.c -o nuaa -l pthread(假设程序所在文件名位nuaa.c)

注:

1.上述程序中创建了两个线程,线程执行函数的名字随便写,但是线程执行函数的格式必须这么写。

2.在上述程序中我故意使用了_exit(0);目的是说明一个问题,_exit(0)和exit(0)的区别是什么?:首先exit(0)是通过_exit(0)来实现的,其次,exit(0)回执行一些后续的处理,比如把缓冲区中的内容写到磁盘的相应位置上,关闭没有关闭的文件......而_exit(0)不会做这些事情。
原文链接:https://blog.csdn.net/nuaa_ybl/article/details/7091745

软中断信号

signal(SIGCHLD, SIG_IGN)

signal(参数一,参数二)

  • 参数一:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。
  • 参数二:我们处理的方式(是系统默认还是忽略还是捕获)。可以写一个handdle函数来处理我们捕获的信号。

SIGCHLD信号

子进程结束时, 父进程会收到这个信号。
如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情 况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程 来接管)。

SIG_ING

忽略的意思

使用signal(SIGCHLD, SIG_IGN)处理僵尸进程

SIGCHLD信号是子进程退出的时候向父进程发送的,signal(SIGCHLD, SIG_IGN)表示父进程忽略SIGCHLD信号。(SIG_IGN表示忽略)

通过signal(SIGCHLD, SIG_IGN)通知内核对子进程的结束不关心,由内核回收。如果不想让父进程挂起,可以在父进程中加入一条语句:signal(SIGCHLD,SIG_IGN);

子进程结束时, 父进程会收到这个信号。
如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情 况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止

你可能感兴趣的:(内核,linux,java,嵌入式,操作系统)