Search code examples
linuxtimersignalssetitimersigaction

reacting to two signals sent to the CPU in linux


I wrote the following code:

void handler (int signal) {

if (signal==SIGVTALRM) {
    printf("one second passed\n");
}

if (signal==SIGALRM) {
    alarm(1);
    //printf("curret context is %ld\n"  , thread_tbl[currThreadNum].uc.uc_mcontext.cr2);
    currThreadNum=(currThreadNum+1)%THREAD_NUM;
    printf("switching from thread #%d to thread #%d\n", ((currThreadNum-1+THREAD_NUM)%THREAD_NUM), currThreadNum);
    printf("current thread number is %d\n", 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=0\n");
swapcontext(&temp_context, &thread_tbl[0].uc);

}

My purpose was to write a program that responds to both SIGVTALRM signal and SIGALRM. However, when I run the program, it seems that the program only react to SIGALRM signals.

In the function ut_start() I started a timer that resets every 100 usec. I don't see any evidence that it works.

One more thing, how can debug this program so I can actually see the timer has started? Is there any variable that I can see in debug mode that tells me something about the status of the timer?


Solution

  • I think I found the answer by myself.

    The functions I supplies are only a part of my program. Somewhere in the program, I used the function sleep().

    According to the documentation of sleep (http://linux.die.net/man/3/sleep):

    sleep() may be implemented using SIGALRM; mixing calls to alarm(2) and sleep() is a bad idea.Using longjmp(3) from a signal handler or modifying the handling of SIGALRM while sleeping will cause undefined results.

    When I removed the sleep() function, everything was OK.