setjmp和信号的结合
1 #include <stdio.h>
2 #include <setjmp.h>
3 #include <signal.h>
4
5 jmp_buf buf;
6
7 void func(int sig){
8 printf("Hello worid!\n");
9 longjmp(buf,1);
10 }
11
12 int main(){
13 setjmp(buf);
14 signal(SIGINT,func);
15 while(1);
16 return 0;
17 }
~ 把setjmp注释掉之后发送SIGINT信号,每次都能打印Hello world 而如果按照上面的书写方式,则只能打印一次Hello world 这是为什么? setjmp 和longjmp结合使用可以跳转使程序重启,为什么不能打印Hello world?
[解决办法]
signal函数,内部和setjmp,longjmp的实现,有一定的关系。
处理不好,会有冲突。
[解决办法]
当 setjmp 和 longjmp 是一起使用时,它们提供一种方法来执行非本地 goto. 它们通常用来传递给错误处理或恢复以前被调用例程中的代码的执行控制,而无需使用标准的调用或返回约定。
警告说明警告
但是,因为setjmp和 longjmp不支持 c + + 对象语义,并且因为它们可能会降低性能,防止对局部变量的优化,我们建议您不要使用它们在 c + + 程序中。 我们建议使用 try/ catch改为构造。
如果您决定使用 setjmp/ longjmp在 c + + 程序中,还包括 SETJMP。H 或 SETJMPEX。H 以确保正确 c + + 异常处理的函数之间的互动。 如果您使用 /EH 进行编译,本地对象的析构函数调用堆栈展开过程。 如果您使用/EHs编译,以及您的函数调用的函数,它使用一个 nothrow 并使用函数nothrow调用 longjmp,然后析构函数展开可能不会发生,具体取决于优化程序。
在可移植代码中,当非本地goto调用 longjmp执行时,正确销毁的基于帧的对象可能不可靠。
http://technet.microsoft.com/zh-cn/interopmigration/yz2ez4as
[解决办法]
两种异常处理机制不相容
跟
两种防火墙杀毒软件不相容
类似。