使用sigsetjmp()与siglongjmp()
int sigsetjmp(sigjmp_buf env, int savesigs);
void siglongjmp(sigjmp_buf env, int val);
解决竞态问题的另一个办法: 从信号函数中调用siglongjmp().
- siglongjmp() 作用: 局部跳转,使用它可以从一个函数跳至另一个函数.
- 使用sigsetjmp(), 建立跳转缓冲区.
- 第一个参数: 当前程序环境变量; 第二个为非0 时, 标识: 保存当前的信号集, 非0, 标识: 标识不保存当前信号集.
- 返回值: 设置跳转缓冲区时, 返回值为 0; 当调用siglongjmp()后, 返回值为 siglongjmp() 的第二个参数, 注意: 该参数必须为非0值
void sig_alarm(int sig)
{
myprint("The func sig_alarm() is %d", sig);
siglongjmp(env, 2);
}
void test()
{
int ret = 0