文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>信号量,setjmp,longjmp(摘自c/c++论坛)

信号量,setjmp,longjmp(摘自c/c++论坛)

时间:2007-04-07  来源:tourer

#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <setjmp.h>
#include <signal.h>
int jn=0;
jmp_buf position;
void jmp_func1()
{
printf("get the signal for %d times\n",++jn);
longjmp(position,1);
}
void jmp_func2()
{
longjmp(position,2);
}
int
main()
{
pid_t pid = getpid();
signal(SIGUSR1,jmp_func1);
signal(SIGUSR2,jmp_func2);
(24行) setjmp(position); //在我的rh9上面这个函数没有保存信号屏蔽码
sleep(1);
kill(pid,SIGUSR1);/*在kill函数返回前执行信号处理程序,在实际的信号处理程序前,
先屏蔽 SIGUSR1,然后调用jmp_func1函数.在你这个函数中,你使用了longjmp,因此代码
跳到24行,这个时候严格说来:
没有从kill正常退出,也没有进入信号处理程序的后续例程.这个信号处理程序的后续例程的
主要工作是恢复被屏蔽的信号,恢复保存的寄存器等资源,并返回到正常程序中,但用了longjmp所有这些都不做了,直接跳到24行,继续执行,然后又一次调用kill,此次发送的信号已经被屏蔽,因此kill会很快退出,同时你的程序也结束了.
}
修改方法就很简单了,一是使用sigsetjmp和siglongjmp,二是在信号处理程序中自己恢复被屏蔽的信号,我将此两种方法的代码都贴出来让你看看,这两种代码在rh9下面都测试成功了.

版本一: 使用sigsetjmp

CODE:
[Copy to clipboard]
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <setjmp.h>
#include <signal.h>
int jn=0;
sigjmp_buf position;
void jmp_func1()
{
printf("get the signal for %d times\n",++jn);
siglongjmp(position,1);
}
void jmp_func2()
{
siglongjmp(position,2);
}
int
main()
{
pid_t pid = getpid();
signal(SIGUSR1,jmp_func1);
signal(SIGUSR2,jmp_func2);
sigsetjmp(position,1);
sleep(1);
kill(pid,SIGUSR1);
}
版本二:自己恢复被屏蔽的信号

CODE:
[Copy to clipboard]
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <setjmp.h>
#include <signal.h>
int jn=0;
jmp_buf position;
sigset_t mask;

void jmp_func1()
{

printf("aget the signal for %d times\n",++jn);
sigprocmask(SIG_UNBLOCK,&mask,NULL);
longjmp(position,1);
}
void jmp_func2()
{
sigprocmask(SIG_UNBLOCK,&mask,NULL);
longjmp(position,2);
}
int
main()
{
pid_t pid = getpid();
signal(SIGUSR1,jmp_func1);
signal(SIGUSR2,jmp_func2);
sigemptyset(&mask);
sigaddset(&mask,SIGUSR1);

setjmp(position);
sleep(1);
kill(pid,SIGUSR1);
}

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载