C 异常捕获问题

dahan_wangtao 2008-11-25 03:21:22
void mm(int i)
{
printf("mm_wrong\n");
siglongjmp(jmpbuf, 1);
};
int tt(int m ,int j)
{
return m/j;
}
int test (int m ,int j)
{
int tt2 = 0;
if (sigsetjmp(jmpbuf, 1))
{
printf("error\n");
goto E1;
}
struct sigaction sa, oldsa;
sigemptyset(&sa.sa_mask);
sigfillset(&sa.sa_mask);
sa.sa_handler = mm;
sigaction(SIGFPE, &sa, &oldsa);

for ( jj=0; jj<5; jj++)
{
// raise(SIGFPE); (这里如果用raise发出异常就没问题)
tt2 +=tt(m, j);

printf("J:%d\n",jj);
}

E1:

return tt2;
}

int main (int argc, char * const argv[]) {

int i ;
int m65;
for (i = 0; i< 5; i++)
{
printf("i=%d\n",i);
m65 = test(9, 0);

}

std::cout << "Hello, World!\n"<<m65<<"i:"<<i;
return 0;
}
问什么用Raise的话就没问题,而用9/0(SIGFPE)就只能捕获到一次异常,下一次i==1的时候系统就出错了。
...全文
1027 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
fibbery 2008-12-03
  • 打赏
  • 举报
回复
就是使用sigaction函数再重新注册一下信号处理函数
dahan_wangtao 2008-12-03
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 cceczjxy 的回复:]
引用 20 楼 dahan_wangtao 的回复:
引用 16 楼 cceczjxy 的回复:
但是第二次循环就被中断了

第二次中断是什么原由?SIGFPE信号?如果是这样,那你在信号句柄内再设置一遍信号句柄试一下。

中断的原因也是在除法异常那里,程序就给出异常了。
还有就是如何重新设置信号量句柄?我的程序中那种在被调用的函数中重新设置不可以吗?



这可能在于你的系统,对于遵循posix1.3的系统,使用sigaction设置的函数句柄…
[/Quote]

怎么样才叫重新设置? 如何重新设置? 重新在负值一次不可以吗?
dahan_wangtao 2008-12-03
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 fibbery 的回复:]
就是使用sigaction函数再重新注册一下信号处理函数
[/Quote]
我在被调用的函数里面每次都是重新设置sigaction的,请问还有什么办法?
dahan_wangtao 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 fibbery 的回复:]
对,可以考虑一下16楼的建议,有些系统收到信号并执行了信号处理程序后,就恢复了默认处理函数,需要重新注册。忘了在哪本书上看过。
[/Quote]

中断的原因也是在除法异常那里,程序就给出异常了。
还有就是如何重新设置信号量句柄?我的程序中那种在被调用的函数中重新设置不可以吗?
dahan_wangtao 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 cceczjxy 的回复:]
但是第二次循环就被中断了

第二次中断是什么原由?SIGFPE信号?如果是这样,那你在信号句柄内再设置一遍信号句柄试一下。
[/Quote]
中断的原因也是在除法异常那里,程序就给出异常了。
还有就是如何重新设置信号量句柄?我的程序中那种在被调用的函数中重新设置不可以吗?
dahan_wangtao 2008-12-02
  • 打赏
  • 举报
回复
to superyys : 主要是解码的过程中媒体流的异常,但要保证正常执行,利用异常捕捉就可以保证大量的异常可以被处理,而且效能也比较好。
cceczjxy 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 dahan_wangtao 的回复:]
引用 16 楼 cceczjxy 的回复:
但是第二次循环就被中断了

第二次中断是什么原由?SIGFPE信号?如果是这样,那你在信号句柄内再设置一遍信号句柄试一下。

中断的原因也是在除法异常那里,程序就给出异常了。
还有就是如何重新设置信号量句柄?我的程序中那种在被调用的函数中重新设置不可以吗?

[/Quote]

这可能在于你的系统,对于遵循posix1.3的系统,使用sigaction设置的函数句柄,除非你重新设置,他应该一直保持着你的设置。
但现在看来,是你的系统没有保存这样的设置。
cceczjxy 2008-12-01
  • 打赏
  • 举报
回复
但是第二次循环就被中断了

第二次中断是什么原由?SIGFPE信号?如果是这样,那你在信号句柄内再设置一遍信号句柄试一下。
dahan_wangtao 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 cceczjxy 的回复:]
那你
改成这样看看

int test (int m ,int j)
{
int tt2 = 0;
struct sigaction sa, oldsa;
sigemptyset(&sa.sa_mask);
sigfillset(&sa.sa_mask);
sa.sa_handler = mm;
sigaction(SIGFPE, &sa, &oldsa);

if (sigsetjmp(jmpbuf, 1))
{
printf("error\n");

} else {
for ( jj=0; jj <5; jj++)
{
// raise(SIGFPE); (这里如果用raise发出异常就没问题)
tt2 +=tt(m, j);
printf("J:%d\n…
[/Quote]

To cceczjxy :
这样做的结果是一样的,第一次循环可以正常打印出error, 但是第二次循环就被中断了,执行不下去。
这个原因很奇怪,希望你能继续帮我 解决问题,谢谢
superyys 2008-12-01
  • 打赏
  • 举报
回复
实在想不出在实际编程中有使用sigsetjmp的理由 ,严重违反结构化程序设计原则.

还有有些严重问题的信号处理(如数组越界SIGSEGV等)是不可再恢复的,即使你用c++异常捕捉或者信号处理函数也没有用的.最好的办法是进程退出,而不是继续运行.
fibbery 2008-12-01
  • 打赏
  • 举报
回复
对,可以考虑一下16楼的建议,有些系统收到信号并执行了信号处理程序后,就恢复了默认处理函数,需要重新注册。忘了在哪本书上看过。
hanb99 2008-11-30
  • 打赏
  • 举报
回复
mark
cceczjxy 2008-11-30
  • 打赏
  • 举报
回复
那你
改成这样看看

int test (int m ,int j)
{
int tt2 = 0;
struct sigaction sa, oldsa;
sigemptyset(&sa.sa_mask);
sigfillset(&sa.sa_mask);
sa.sa_handler = mm;
sigaction(SIGFPE, &sa, &oldsa);

if (sigsetjmp(jmpbuf, 1))
{
printf("error\n");

} else {
for ( jj=0; jj <5; jj++)
{
// raise(SIGFPE); (这里如果用raise发出异常就没问题)
tt2 +=tt(m, j);
printf("J:%d\n",jj);
}
}

return tt2;
}

即不使用goto
shmilvy 2008-11-29
  • 打赏
  • 举报
回复
对头~~~
gwy2002y 2008-11-28
  • 打赏
  • 举报
回复
我要分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分分分
分分分分分分分分分分分分分分
android2008 2008-11-27
  • 打赏
  • 举报
回复
mark
dahan_wangtao 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cceczjxy 的回复:]
这个应该是不同系统在siglongjmp跳转后自动变量及信号屏蔽的恢复时的差异,linux/unix的一些标准没有规定这些具体该怎么做。
unix环境高级编程内有这样的话:
当l o n g j m p返回到,这些变量的值是否能恢复到以前调用s e t j m p时的值(即滚回原先值),?不幸的是,对此问题的回答是“看情况”。大多数实现并不滚回这些自动变量和寄存器变量的值,而所有标准则说它们的值是不确定的。如果你有一个自动变量,而又不想使其值滚…
[/Quote]
上述方法结果还是一样,不能解决问题,希望有其他的方法
dahan_wangtao 2008-11-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cceczjxy 的回复:]
这个应该和你的系统有关,

CentOS release 4.5
2.6.9-55.0.9.EL

这上边,两种情况的结果一样
你的什么系统?
[/Quote]

这种问题如何如何解决?
dahan_wangtao 2008-11-26
  • 打赏
  • 举报
回复
to cceczjxy :
我的是MAC osx,不知道如何解决这个问题
cceczjxy 2008-11-26
  • 打赏
  • 举报
回复
这个应该和你的系统有关,

CentOS release 4.5
2.6.9-55.0.9.EL

这上边,两种情况的结果一样
你的什么系统?
加载更多回复(5)

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧