|
|
|
|
 超时信号处理 - luoyi973 [ 2005-02-21 13:09 | 932 byte(s)]
 Re: 超时信号处理 - xihoujin [ 2005-02-21 15:54 | 365 byte(s)]
 Re: 超时信号处理 - luoyi973 [ 2005-02-21 16:10 | 539 byte(s)]
 Re: 超时信号处理 - luoyi973 [ 2005-02-21 16:13 | 66 byte(s)]
 Re: 超时信号处理 - alula [ 2005-02-22 09:29 | 232 byte(s)]
 Re: 超时信号处理 - xihoujin [ 2005-02-23 16:33 | 764 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
想收到一个信号,然后离开跳出函数处理应该怎么做?以下这段代码是不可以的,请问各位通常是怎么做的?
void sigfun(int s)
{
printf("recevice a signal %d
", s);
signal(s, SIG_DFL);
throw s;
}
int main()
{
try
{
signal(SIGALRM, sigfun);
alarm(5);
sleep(10); //<==超时后不想再往下执行了
printf("hello
");
return 0;
}
catch(...)
{
printf("any catch ...
");
return -1;
}
}
在linux9里,当SIGALRM信号发生后,不能throw,否则总是不断收到SIGABRT,程序Aborted了:(
请教高手,谁能解释一下?正确的方法应该是什么?
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
如果要在信号来之后处理很多事情
最好放在信号处理函数之外执行,
方法可以:
1,g_timeout_add() or g_idle_add() 如果你也使用了glib库的话,
2,可试试信号处理函数中改变一个global的变量,而在另外一个主loop中检测这个变量值而调用
其他函数.(一般需要处理信号的程序该都是一直在运行的吧?该有个显式或隐式的loop.
仅供参考.
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
谢谢,我是说有没有什么简便的办法。按照你说的,程序都应该改成类似这样的:
int timeout_flage = 0;
void sigfun(int s)
{
timeout_flage = 1;
}
int main()
{
signal(....);
alert(5);
sleep(1);
if(timeout_flage == 1)
....
sleep(1);
if(timeout_flage == 1)
....
....
....
如果有很多步骤,那太麻烦了呀
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
我想是因为 信号处理函数 不在普通函数栈上执行,也就是不是在你的try block之内,所以catch不到。
信号处理是操作系统的异步事件,这里抛出异常,可能栈的辗转开解都不能正常进行。
用简单的方式写代码吧,别自找苦吃。
|
|
|
----
温故知新
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
是的,能用比较简单明白的方法实现最好了。
另外,
对于我说的方法,可不可以如下试试?
void
signal_func{
g_timeout_add (timeout, time_func,NULL);
return;
}
static gboolean time_func()
{
//your own work?
return true;
}
main{ }
{
GMainLoop *g_main;
...
signal(SIGNAL,signal_func);
g_main = g_main_new (FALSE);
g_main_run (g_main);
}
另外对于设置global变量方法也类似,
首先main中该有个显式或隐式的
while(1)
{
//here judge the global value and do something else
}
|
|
|
[Original]
[Print]
[Top]
|
|
|