ToB企服应用市场:ToB评测及商务社交产业平台

标题: Linux利用系统之进程信号 [打印本页]

作者: 兜兜零元    时间: 2024-8-6 04:35
标题: Linux利用系统之进程信号
一、信号

1、概念


2、系统界说的信号列表



3、常见的信号处理方式


二、产生信号的方式

1、终端按键

(1)组合键


(2)示例代码

  1. void handler(int signo)
  2. {
  3.     cout << "get a signo: " << signo << endl;
  4. }
  5. int main()
  6. {
  7.     for(int i = 1; i <= 31; ++i)
  8.     {
  9.         signal(i, handler);
  10.     }
  11.     while(true)
  12.     {
  13.         cout << "I am a crazy process" << " pid = " << getpid() << endl;
  14.         sleep(1);
  15.     }
  16.     return 0;
  17. }
复制代码
(3)运行效果



2、调用系统函数

(1)kill下令


(2)kill函数

【1】函数


【2】描述


(3)raise函数

【1】函数


【2】描述


(4)abort函数

【1】函数


【2】描述


3、软件条件

(1)alarm函数


(2)描述


(3)示例代码

  1. void handler(int signo)
  2. {
  3.     cout << "get signo: " << signo << endl;
  4.     unsigned int n = alarm(5);
  5.     cout << "剩余时间:" << n << endl;
  6. }
  7. int main()
  8. {
  9.     signal(SIGALRM, handler);
  10.     alarm(50);
  11.     while(true)
  12.     {
  13.         cout << "this process pid: " << getpid() << endl;
  14.         sleep(1);
  15.     }
  16.     return 0;
  17. }
复制代码
(4)运行效果



4、硬件异常

硬件异常被硬件以某种方式检测到并通知内核,然后内核向当前进程发送适当的信号。
三、阻塞信号

1、概念


2、信号在内核中的示意图


3、解释


四、信号集

1、sigset_t

(1)界说



(2)应用


2、信号集利用函数

(1)函数


(2)描述


(3)返回值


3、sigprocmask函数

(1)函数


(2)描述


(3)参数how的有效值


4、sigpending函数

(1)函数


(2)描述


5、示例代码

  1. #include<iostream>
  2. #include<unistd.h>
  3. #include<signal.h>
  4. using namespace std;
  5. void PrintSignal(const sigset_t& pending)
  6. {
  7.     for(int i = 31; i >= 1; --i)
  8.     {
  9.         if(sigismember(&pending, i))
  10.             cout << "1";
  11.         else
  12.             cout << "0";
  13.     }
  14.     cout << "\n" << endl;
  15. }
  16. int main()
  17. {
  18.     sigset_t bset, oset;
  19.     sigemptyset(&bset);
  20.     sigemptyset(&oset);
  21.     for(int i = 1; i <= 31; ++i)
  22.     {
  23.         sigaddset(&bset, i);
  24.     }
  25.     sigprocmask(SIG_SETMASK, &bset, &oset);
  26.     sigset_t pending;
  27.     sigemptyset(&pending);
  28.     while(true)
  29.     {
  30.         int ret = sigpending(&pending);
  31.         if(ret == -1)
  32.             continue;
  33.         PrintSignal(pending);
  34.         sleep(1);
  35.     }
  36.     return 0;
  37. }
复制代码
五、信号捕捉

1、捕捉信号

(1)概念


(2)过程示意图


2、signal函数

(1)函数


(2)描述


3、sigaction函数

(1)函数



(2)描述


4、可重入函数

(1)概念


六、SIGCHLD信号


   本文到这里就竣事了,如有错误或者不清楚的地方接待批评或者私信
创作不易,如果觉得博主写得不错,请点赞、收藏加关注支持一下




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4