您的位置:首页 > 其它

sigsetjmp()与siglongjmp()

2017-03-27 18:34 1731 查看

使用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, i = 0;

signal(SIGALRM, sig_alarm);
alarm(5);
while(1)
{

ret = sigsetjmp(env, 1);
if(ret)
{
myprint("siglongjmp() callback OK, ret = %d", ret);
}

myprint("The loop is : %d", i++);
sleep(2);
}
}

输出内容为:
The loop is : 0 [42], [siglongjmp_sigsetjmp.c]
The loop is : 1 [42], [siglongjmp_sigsetjmp.c]
The loop is : 2 [42], [siglongjmp_sigsetjmp.c]
The func sig_alarm() is 14 [22], [siglongjmp_sigsetjmp.c]
siglongjmp() callback OK, ret = 2 [39], [siglongjmp_sigsetjmp.c]
The loop is : 3 [42], [siglongjmp_sigsetjmp.c]
The loop is : 4 [42], [siglongjmp_sigsetjmp.c]
The loop is : 5 [42], [siglongjmp_sigsetjmp.c]
The loop is : 6 [42], [siglongjmp_sigsetjmp.c]
The loop is : 7 [42], [siglongjmp_sigsetjmp.c]
...


Linux 与进程ID有关的函数 ;

pid_t getpid(void); //获取被调进程的ID;

pid_t getppid(void); //获取被调进程父进程的ID;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: