对发送到linux中CPU的两个信号作出反应



我写了以下代码:

void handler (int signal) {
if (signal==SIGVTALRM) {
    printf("one second passedn");
}
if (signal==SIGALRM) {
    alarm(1);
    //printf("curret context is %ldn"  , thread_tbl[currThreadNum].uc.uc_mcontext.cr2);
    currThreadNum=(currThreadNum+1)%THREAD_NUM;
    printf("switching from thread #%d to thread #%dn", ((currThreadNum-1+THREAD_NUM)%THREAD_NUM), currThreadNum);
    printf("current thread number is %dn", currThreadNum);
    thread_tbl[(currThreadNum-1+THREAD_NUM)%THREAD_NUM].vtime=+1000;
    swapcontext( &(thread_tbl[ (currThreadNum-1+THREAD_NUM)%THREAD_NUM ].uc), &(thread_tbl[currThreadNum ].uc) );
}

}

int ut_start(void){

int i=0;
struct sigaction sa;
struct itimerval itv;
// set the signal
sa.sa_flags=SA_RESTART;
sigfillset(&sa.sa_mask);
sa.sa_handler = handler;
itv.it_interval.tv_sec=0;
itv.it_interval.tv_usec=100;
itv.it_value=itv.it_interval;
if (sigaction(SIGALRM, &sa, NULL)<0) {
    abort();
}
if (sigaction(SIGVTALRM, &sa, NULL)<0) {
    abort();
}
setitimer(ITIMER_VIRTUAL, &itv, NULL);
for(i=0; i<TAB_SIZE; i++) {
    getcontext(&thread_tbl[i].uc);   // get the context the content of current thread
    makecontext(&thread_tbl[i].uc, (void(*)(void))func ,1, i); // when this context is activated, func will be executed and then uc.uc_link will get control
}
//start running
alarm(1);
currThreadNum=0;
//printf("currThreadNum=0n");
swapcontext(&temp_context, &thread_tbl[0].uc);

}

我的目的是编写一个同时响应SIGVTALRM信号和SIGALRM的程序。然而,当我运行程序时,程序似乎只对SIGALRM信号做出反应。

在函数ut_start()中,我启动了一个计时器,它每100 usec重置一次。我看不到任何证据表明它有效。

还有一件事,如何调试这个程序,这样我就可以看到计时器已经启动了?在调试模式下,我能看到什么变量告诉我有关计时器状态的信息吗?

我想我自己找到了答案。

我提供的功能只是我程序的一部分。在程序的某个地方,我使用了sleep()函数。

根据睡眠文件(http://linux.die.net/man/3/sleep):

sleep()可以使用SIGALRM来实现;混合呼叫报警(2)和sleep()是个坏主意。从信号处理程序或在睡眠时修改SIGALRM的处理将导致未定义后果

当我删除sleep()函数时,一切都很好。

相关内容

  • 没有找到相关文章

最新更新