当前位置:   article > 正文

linux--信号

linux--信号

1.信号的基本介绍

信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作;

与信号有关的系统调用在<signal.h>头文件中.


(1)信号的存储位置


vim    /usr/include/x86_64-linux-gnu/bits/signum.h   旧版
新版(23版)
vim    /usr/include/x86_64-linux-gnu/bits/signum-arch.h
vim    /usr/include/x86_64-linux-gnu/bits/signum-generic.h

(2)常见信号对应的功能

SIGABORT       *进程异常终止
SIGALRM         超时警告
SIGFPE            *浮点运算异常
SIGHUP           连接挂断
SIGILL               *非法指令
SIGINT              终端中断
SIGKILL             终止进程(此信号不能被捕获或忽略)
SIGPIPE             向无读进程的管道写数据
SIGQUIT             终端退出

SIGSEGV             *无效内存段访问
SIGTERM               终止
SIGUSR1              用户定义信号1
SIGUSR2              用户定义信号2

(3)信号的值
  1. 信号名称 信号代号
  2. #define SIGHUP 1
  3. #define SIGINT 2 //键盘按下 Ctrl+c 时,会产生终端中断信号
  4. #define SIGQUIT 3//键盘按下 Ctrl+\ 时,会产生终端退出信号
  5. #define SIGILL 4
  6. #define SIGTRAP 5
  7. #define SIGABRT 6
  8. #define SIGIOT 6
  9. #define SIGBUS 7
  10. #define SIGFPE 8
  11. #define SIGKILL 9 //该信号的响应方式不允许改变
  12. #define SIGUSR1 10
  13. #define SIGSEGV 11
  14. #define SIGUSR2 12
  15. #define SIGPIPE 13 //读端关闭的描述符,写端写入时产生,该信号会终止程序(向无读进程的管道写数据)
  16. #define SIGALRM 14
  17. #define SIGTERM 15 //系统 kill 命令默认发送的信号
  18. #define SIGSTKFLT 16
  19. #define SIGCHLD 17 //子进程结束后,会默认给父进程发送该信号
  20. #define SIGCONT 18
  21. #define SIGSTOP 19
  22. #define SIGTSTP 20
  23. #define SIGTTIN 21
  24. #define SIGTTOU 22
  25. #define SIGURG 23
  26. ...

2.信号的响应方式

三种响应方式:默认,忽略,自定义;
演示默认的处理方式:
也就是收到信号了,进程按照信号默认的方式去处理;
代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <assert.h>
  5. #include <string.h>
  6. int main()
  7. {
  8. while(1)
  9. {
  10. printf("main run\n");
  11. sleep(1);
  12. }
  13. exit(0);
  14. }

键盘按下ctrl+c时,其实就是因为该进程收到了一个信号:SIGNT----终端中断的信号.(2号信号);就是说,在键盘上按下ctrl+c时,会给当前终端前台执行的进程发送SIGINT信号;

3.改变信号的响应方式

(1)设置信号的响应方式:通过系统调用signal();

image-20230921224128050.png

(2)修改信号的响应方式

那如果我们改变信号的响应方式呢?

1)自定义

用signal修改SIGINT信号的响应方式示例如下

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <assert.h>
  5. #include <string.h>
  6. #include <signal.h>
  7. void sig_fun(int sig)
  8. {
  9. printf("sig=%d\n",sig);
  10. }
  11. int main()
  12. {
  13. signal(SIGINT,sig_fun);
  14. while(1)
  15. {
  16. printf("main run\n");
  17. sleep(1);
  18. }
  19. exit(0);
  20. }

那如何结束该进程呢?
方法一:
打开另外一个终端,通过ps -ef|grep main这个命令找到该进程的pid,然后kill掉它.
方法二:
当然,我们也可以ctrl+,这个是终端退出的信号;

2)忽略

将上面12行的代码修改成:

signal(SIGINT,SIG_IGN);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/395495
推荐阅读
相关标签
  

闽ICP备14008679号