signal的samplecode

一个signal的samplecode, 需要注意的地方是:

  1. 资源的释放和析构
  2. 锁的控制
  3. 资源的清理
  4. 事务的控制

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* This is signal handler common code */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
#include <iostream>
#include <vector>
#include <atomic>
#include <csignal>
#include <thread>
 
volatile std::atomic_bool g_bExitFlag{false};
volatile std::atomic_bool g_bInitFlag{false};
 
constexpr uint8_t kNumOfThreads = 5;
std::vector<std::thread> gThreads;
 
void SignalHandlerThread(void) {
    int sig = -1;
    sigset_t sigset;
 
    if (sigemptyset(&sigset) != 0) {
        /* empty the set of signals */
        printf("Emptying signal set failed.");
        return;
    }
 
    if (sigaddset(&sigset, SIGTERM) != 0) {
        /* add SIGTERM to signal set */
        printf("Adding SIGTERM to signal set failed.");
        return;
    }
 
    if (sigaddset(&sigset, SIGINT) != 0) {
        /* add SIGINT to signal set */
        printf("Adding SIGINT to signal set failed.");
        return;
    }
 
    /* wait until signal SIGTERM/SIGINT occurs */
    while (sig != SIGTERM && sig != SIGINT) {
        if (0 != sigwait(&sigset, &sig)) {
            printf("Sigwait() was called with an invalid signal set.");
            return;
        }
    }
 
    printf("SignalHandler get the signal(%d)\n", sig);
    g_bExitFlag = true;
}
 
int SetSignalMask()
{
    bool success = true;
    sigset_t signals;
 
    /* Block all signals except SIGABRT, SIGBUS, SIGFPE, SIGILL and SIGSEGV */
    success = success && (sigfillset(&signals) == 0);
    success = success && (sigdelset(&signals, SIGABRT) == 0);
    success = success && (sigdelset(&signals, SIGBUS) == 0);
    success = success && (sigdelset(&signals, SIGFPE) == 0);
    success = success && (sigdelset(&signals, SIGILL)) == 0;
    success = success && (sigdelset(&signals, SIGSEGV) == 0);
    success = success && (pthread_sigmask(SIG_SETMASK, &signals, nullptr) == 0);
    if (!success) {
        printf("SetSignalMask failed. \n");
        return -1;
    }
 
    return 0;
}
 
int Init()
{
    /* initialize signal handling */
    SetSignalMask();
 
    /* spawn a new signal handler thread */
    gThreads.push_back(std::thread(SignalHandlerThread));
    g_bInitFlag = true;
     
    //printf("tid thtread id    :%lu. \n", gThreads.begin()->get_id());
    printf("tid native handle :%lu. \n", static_cast<pthread_t>(gThreads.begin()->native_handle()));
 
    return 0;
}
 
void Shutdown()
{
    /* check state */
    /* clean-up */
    /* kill/cancel pthread */
 
    /* wait pthread */
    printf("Waitfor the threads.\n");
    for (std::vector<std::thread>::iterator it = gThreads.begin();
            it != gThreads.end(); it++) {
        it->join();
    }
 
    std::cout << "Terminating." << std::endl;
}
 
int Run()
{
    Init();
    while (!g_bExitFlag) {
        /* Todo:work thread */
    }
 
    Shutdown();
    return 0;
}
 
int main() {
    try {
        Run();
    } catch (std::runtime_error& e) {
        std::cout << "Runtime error: " << e.what();
    } catch (std::logic_error& e) {
        std::cout << "Logic error: "<< e.what();
    } catch (std::exception& e) {
        std::cout << "Exception: "<< e.what();
    } catch (...) {
        std::cout << "Unknown exception";
    }
 
    return 0;
}

 

复制代码
/* like pause() */
void HandleSignals()  {
  sigset_t sigset;
  int signal = 0;
  bool done = false;

  ::sigemptyset(&sigset);
  ::sigaddset(&sigset, SIGTERM);
  ::sigaddset(&sigset, SIGINT);
while (!done) {
    timespec timeout;
    timeout.tv_sec = 1;
    timeout.tv_nsec = 0;
    signal = ::sigtimedwait(&sigset, NULL, &timeout);

    switch (signal) {
      case SIGINT:
        printf("call signal SIGINT");
        done = true;
        break;
      case SIGTERM:
        printf("call signal SIGTERM");
        done = true;
        break;
    }
  }
}
复制代码

 

posted @   sciapex  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示