Linux信号概念

image.png

系统定义好的信号

image.png

常见的信号

image.png

产生信号的条件

image.png
image.png

信号产生

image.png

  1. #include<unistd.h>
  2. #include <stdio.h>
  3. int main(void)
  4. {
  5. while (1){
  6. sleep(1);
  7. printf("signal %d\n",getpid());
  8. }
  9. return 0;
  10. }

image.png
image.png
jobs显示当前暂停的迸程
bg n辻后台程序迄行(n是程序的名字)
fg n切换到前台返行
命令后面加&表示后台返行
kill -9 xxx(pid)杀死进程

发送信号的函数

image.png

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <signal.h>
  4. #include <stdlib.h>
  5. int main(void){
  6. //荻取当前pid
  7. pid_t pid = getpid();
  8. printf("cur pid = %d\n",pid);
  9. //給pid发送一个挂起信号
  10. printf("kill send SIGTEST\n");
  11. kill(pid,SIGTSTP);
  12. //給当前迸程发送一个挂起信号
  13. printf("raise send SIGTEST\n");
  14. raise(SIGTSTP);
  15. //定肘一秒狆后給自己爰送SIGALARM信号,默人終止当前迸程
  16. printf("alarm send SIGALARM\n");
  17. alarm(1);
  18. for (int i= 0;;i++){
  19. printf("%d\n",i);
  20. sleep(0.1);
  21. }
  22. //終止当前迸程
  23. printf("run end \n");
  24. abort();
  25. return 0;
  26. }

信号捕捉

image.png

signal捕获信号

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <signal.h>
  4. #include <stdlib.h>
  5. //信号赴理函数
  6. void alrmhandler(int sig){
  7. printf("产生一个信号\n");
  8. }
  9. int main(void){
  10. pid_t pid;
  11. //創建一个子迸程
  12. pid = fork();
  13. switch (pid){
  14. case 0: //子迸程赴理
  15. {
  16. //子迸程给父迸程发送一个闹钟信号
  17. sleep(5);
  18. kill(getppid(),SIGALRM);//getppid获取父进程
  19. exit(0);
  20. }
  21. break;
  22. case -1://失败处理
  23. {
  24. perror("fork error\n");
  25. exit(0);
  26. }
  27. break;
  28. default: //父迸程赴理
  29. {
  30. //注册一个閘狆信号処理函数
  31. signal(SIGALRM, alrmhandler);
  32. printf("父迸程等待一个信号\n");
  33. pause();
  34. }
  35. break;
  36. }
  37. printf("run end \n");
  38. return 0;
  39. }

image.png

signal信号恢复

image.png
image.png

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <signal.h>
  4. #include <stdlib.h>
  5. void inthander(int sig){
  6. printf("SIGINT中断\n" ) ;
  7. //恢夐原始赴理,第二次中断肘程序退出
  8. signal(SIGINT,SIG_DFL);
  9. //忽略逑个信号
  10. signal(SIGINT,SIG_IGN);
  11. }
  12. int main(void){
  13. //注册信号赴理凾数
  14. signal(SIGINT,inthander);
  15. while(1){
  16. sleep(1);
  17. printf("signal %d\n",getpid());
  18. }
  19. return 0;
  20. }

image.png

sigaction捕获信号

image.png
image.png
image.png
image.png

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <signal.h>
  4. #include <stdlib.h>
  5. //信号処理凾数
  6. void inthandler(int sig){
  7. printf("产生一个信号\n");
  8. }
  9. int main(void){
  10. //定乂一个信号劫作結杓体
  11. struct sigaction act = {};
  12. //没置信号外理函数
  13. act.sa_handler = inthandler;
  14. //没置信号祢志
  15. act.sa_flags = 0;
  16. //没置信号屏蔽集
  17. sigemptyset(&act.sa_mask);
  18. //注册信号
  19. sigaction(SIGINT,&act,0);
  20. while (1){
  21. printf("%d \n",getpid());
  22. sleep(1);
  23. }
  24. return 0;
  25. }

image.png