免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3726 | 回复: 12
打印 上一主题 下一主题

sigsetjmp与siglongjmp在不同linux内核版本执行问题请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-05 16:00 |只看该作者 |倒序浏览
以下是一个简单的GTKdemo程序,在RedHat9.0(内核2.4.20)下运行正常,在Fedora-6(内核2.6.1下,一旦从siglongjmp回到sigsetjmpGTK就不能响应按键事件,也就是说,key_handler不工作了。不能响应按键事件。百思不得其解,是否sigsetjmp函数在较高的内核版本上支持不好,请高手赐教!



#include <unistd.h>
#include <signal.h>
#include <setjmp.h>
#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>
#include <semaphore.h>
#include <pthread.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>

#define WINDOW_W        320
#define WINDOW_H        240

/********************************************************************************************/

sigjmp_buf jmpbuffer;

static void sigalrm_handler(int signo)
{
        siglongjmp(jmpbuffer, 1);
}

static void* run_thread(void *state_addr)
{
        struct itimerval itv, oldtv;

        itv.it_interval.tv_sec = 0;
        itv.it_interval.tv_usec = 1000000/5;
        itv.it_value.tv_sec = 0;
        itv.it_value.tv_usec = itv.it_interval.tv_usec;
        if(signal(SIGALRM, sigalrm_handler)==SIG_ERR)
                perror("signal(alarm) error.\n";

        if(sigsetjmp(jmpbuffer, 1)==0){
                setitimer(ITIMER_REAL, &itv, &oldtv);
                printf("%s: Sigsetjmp set here.\n", __FUNCTION__);
                while(TRUE)
                        pause();
        }

        printf("%s: Alarm signal occured.\n", __FUNCTION__);
        while(*(int*)state_addr){
                pause();
                printf("%s: Other signal occured.\n", __FUNCTION__);
        }
       
        itv.it_value.tv_sec = 0x7FFFFFFF;
        setitimer(ITIMER_REAL, &itv, &oldtv);
        if(signal(SIGALRM, SIG_DFL)==SIG_ERR)
                perror("signal(alarm) error.\n";

        return NULL;
}

static void key_handler(GtkWidget *widget, GdkEventKey *event, gpointer state_addr)
{
        static pthread_t thread_id;

        printf("@@@@%s: A key was pressed.\n", __FUNCTION__);

        switch (event->keyval) {
                case GDK_Escape:
                        if(*(int*)state_addr){
                                *(int*)state_addr = 0;
                                pthread_join(thread_id, NULL);
                                printf("%s: Thread out.\n", __FUNCTION__);
                        }
                        break;
                case GDK_F1:
                        if(*(int*)state_addr)
                                return;
                        *(int*)state_addr = 1;
                        pthread_create(&thread_id, NULL, run_thread, state_addr);
                        printf("%s: Thread created.\n", __FUNCTION__);
                        break;
                default:
                        break;
        }

        return;
}

static void run(void* state_addr)
{
        GtkWidget *window;

        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
        gtk_window_set_default_size(GTK_WINDOW(window), WINDOW_W, WINDOW_H);
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
        gtk_widget_show_all(window);
        g_signal_connect(G_OBJECT(window), "key_press_event", G_CALLBACK(key_handler), state_addr);

        return;
}

int main(int argc, char *argv[])
{
        int state=0;

        gtk_init(&argc, &argv);
        run(&state);
        gtk_main();

        return 0;
}

[ 本帖最后由 ericooler 于 2007-6-6 17:51 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-06-05 16:25 |只看该作者
顶起来,等待高手。

论坛徽章:
0
3 [报告]
发表于 2007-06-05 17:10 |只看该作者
顶起等待

论坛徽章:
0
4 [报告]
发表于 2007-06-05 18:14 |只看该作者
有高手答复吗?

论坛徽章:
0
5 [报告]
发表于 2007-06-06 10:52 |只看该作者
顶起来等待答复

论坛徽章:
0
6 [报告]
发表于 2007-06-06 11:02 |只看该作者
自己先加PRINTF等跟踪一下看。

论坛徽章:
0
7 [报告]
发表于 2007-06-06 11:08 |只看该作者
斑竹,关键是我不知道跟踪什么东西呀,能想到的我都试了,折腾好几天了,苦恼中

论坛徽章:
0
8 [报告]
发表于 2007-06-06 11:15 |只看该作者
你这个程序自己写的,自己知道跟踪什么。

论坛徽章:
0
9 [报告]
发表于 2007-06-06 11:22 |只看该作者
一旦运行了sigsetjmp,key_handler就不工作了,也就是gtk不能捕获按键事件了,没办法跟跟踪一场在哪里

论坛徽章:
0
10 [报告]
发表于 2007-06-06 12:13 |只看该作者
急等高手指教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP