****************************************************************************************************
为了叙述的方便,使用一个实际的例子,目的很简单,期望能够完成类似signal(signo,类成员函数)这样的功能。 先说说为什么不能直接使用signal(signo , 类成员函数)这种形式,signal函数的原型如下:
--------------------------------------------------------------
void (*signal(int signo,void (*func)(int)))(int);
signo:表示需要处理的信号;
func:是一个指向void funciont(int)类型的函数指针;
返回值:返回值是一个指向void function(int)类型的函数指针。
(摘自:http://www.cnblogs.com/this-543273659/archive/2011/08/17/2143576.html)
上面的这个问题和类成员函数作为线程函数一样,下面这篇文章中说过解决的办法:
http://blog.sina.com.cn/s/blog_ac9fdc0b0101mhxp.html
使用static虽然貌似可以,但pthread_create和signal有一个本质的区别。pthread_create可以传入参数,这样可以将this作为参数传递给线程函数,然后利用this来调用类型成员函数,但是singal的信号处 理函数只能是void function(int)形式,不能想办法将this传递进去。这是最主要的问题,而且在我看来貌似是无解,即使是使用signal 的高端搞法sigaction也不行。因为signal是由内核发出的,它真心不知道这么多东西(这句话瞎说的),所以这条路走不通。下面是一种曲线救国的方法,可以实现完全相同的功能。
流程如下:
(1)使用sigaddset创建信号屏蔽集(需要处理的信号);
(2)使用pthread_sigmask阻止信号发送给当前进程中所有线程;
(3)创建处理信号的线程函数signalThreadFunction(static类型)。需要传递this参数,可以参考:http://blog.sina.com.cn/s/blog_ac9fdc0b0101mhxp.html
(4)在线程函数中还原this,利用this调用实际处理信号的类成员函数this->signalFunction;
(5)在处理信号的类成员函数signalFunction中使用sigwait来等待信号的发生,然后可以随意的处理了。
-----------------------------------------------------------------------------------
codes speak much more than words:
14 //===========================================
15
16 void error(const char *message)
17 {
18
19
20 }
21
22 //==========================================
25 class SignalKiller
26 {
27 public:
28
29
30
31
32
33
35
36
37
39
41
44
45 private:
46
48 private:
49
50
51
52
53 };
54
55 //===========================================
56 void
57 {
58
59
60
61
67
70
71
72
73
74
75
76
77
78
79
80 }
81
82 //===============================================
83 void *SignalKiller::signalThreadFunction(void *arg)
90
91 //===============================================
92 void SignalKiller::signalFunction()
93 {
94
95
96
97
99
100
101
102
104
105
106
107
109
111
113
114
116
117
118
121
122 //================================================
123 int main()
124 {
125
126
127
128
129 }
结果突出一个洋气:
[chenhuan:~/DropBox/programming_unix/lesson12]$./chen
^C
interrupt
^\
quit
[chenhuan:~/DropBox/programming_unix/lesson12]$
每次说举个简单的例子,写着写着就上百行了。想当年考计算机二级,50行代码就顶天了,上机考试碰到链表几乎就是一个字“死”,哈哈,那时真是挺欢乐的~~~~
可找到的出处为【http://blog.csdn.net/wangkaiming123456/article/details/46775651】