Browse Source

linux 信号处理

master
adminPyf 3 years ago
parent
commit
19b615ef33
2 changed files with 62 additions and 0 deletions
  1. +2
    -0
      test_signal/makefile
  2. +60
    -0
      test_signal/test_signal.cpp

+ 2
- 0
test_signal/makefile View File

@ -0,0 +1,2 @@
test_signal:test_signal.cpp
g++ $^ -o $@ -levent

+ 60
- 0
test_signal/test_signal.cpp View File

@ -0,0 +1,60 @@
#include <iostream>
#include <event2/event.h>
#include <signal.h>
using namespace std;
//sock 文件描述符 which 事件类型 arg传递的参数
static void Ctrl_C(int sock,short which , void* arg){
cout << "Ctrl_C" << endl;
}
static void Kill(int sock,short which , void* arg){
cout << "Kill" << endl;
event *ev = (event*)arg;
//如果处于非待决
if(!evsignal_pending(ev,NULL)){
event_del(ev);
event_add(ev,NULL); //再次添加进来
}
}
int main(int agrc,char** agrv){
event_base *base = event_base_new();
//添加信号 ctrl+c ,处于no pending 状态
//evsignal_new 隐藏的状态 EV_SIGNAL|EV_PERSIST
event *csig = evsignal_new(base,SIGINT,Ctrl_C,base);
if(!csig){
cerr << "SIGNAL evsignal_new failed!" << endl;
return -1;
}
if (event_add(csig,0) != 0){
cerr << "SIGANL event_add failed" << endl;
}
//添加kill信号
//非持久事件,只进入一次 event_self_cbarg()传递当前的event
event *ksig = event_new(base,SIGTERM,EV_SIGNAL,Kill,
event_self_cbarg());
if(!ksig){
cerr << "SIGNAL evsignal_new failed!" << endl;
return -1;
}
if (event_add(ksig,0) != 0){
cerr << "SIGANL event_add failed" << endl;
}
//进入事件主循环
event_base_dispatch(base);
event_free(csig);
event_base_free(base);
return 0;
}

Loading…
Cancel
Save