I'm not totally clear about what it is you're trying to do; perhaps this simple example may help and, if it does not, try to explain in some detail just what you are trying to accomplish.
The
alarm() function is used to set up receipt of a SIGALARM signal after a specified number of seconds. The
pause() function is used to suspend execution (put a process to sleep). The
pause() function can only be interrupted by a signal, and if the signal is caught by a function,
pause() will return -1:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alrm_catch (int);
int main (void)
{
(void) fprintf (stdout, "one\n");
/*
* call alrm_catch() when alarm goes off
* could use sigset and get same results
*/
(void) signal (SIGALRM, alrm_catch);
/* schedule alarm for ten seconds from now and pause */
(void) alarm (10);
(void) pause ();
(void) fprintf (stdout, "two\n");
exit (EXIT_SUCCESS);
}
void alrm_catch (int signo)
{
return;
}
Save this a some
filename.c and
Code:
make filename (or cc -o filename filename.c)
filename
one
two (ten seconds later)
This is a one-time process; i.e., you set the alarm for 10 seconds, pause, and then "catch" the signal when the alarm goes off (then this program displays "two" and exits).
A more complex version of this sort of thing would be this example:
Code:
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <errno.h>
#define LOOP_LIMIT 1E12
volatile int sigcount=0;
void catcher( int sig ) {
struct itimerval value;
int which = ITIMER_REAL;
printf( "Signal catcher called for signal %d\n", sig );
sigcount++;
if( sigcount > 1 ) {
/*
* Disable the real time interval timer
*/
getitimer( which, &value );
value.it_value.tv_sec = 0;
value.it_value.tv_usec = 0;
setitimer( which, &value, NULL );
}
}
int main( int argc, char *argv[] ) {
int result = 0;
struct itimerval value, ovalue, pvalue;
int which = ITIMER_REAL;
struct sigaction sact;
volatile double count;
time_t t;
sigemptyset( &sact.sa_mask );
sact.sa_flags = 0;
sact.sa_handler = catcher;
sigaction( SIGALRM, &sact, NULL );
getitimer( which, &pvalue );
/*
* Set a real time interval timer to repeat every 200 milliseconds
*/
value.it_interval.tv_sec = 0; /* Zero seconds */
value.it_interval.tv_usec = 200000; /* Two hundred milliseconds */
value.it_value.tv_sec = 0; /* Zero seconds */
value.it_value.tv_usec = 500000; /* Five hundred milliseconds */
result = setitimer( which, &value, &ovalue );
/*
* The interval timer value returned by setitimer() should be
* identical to the timer value returned by getitimer().
*/
if( ovalue.it_interval.tv_sec != pvalue.it_interval.tv_sec ||
ovalue.it_interval.tv_usec != pvalue.it_interval.tv_usec ||
ovalue.it_value.tv_sec != pvalue.it_value.tv_sec ||
ovalue.it_value.tv_usec != pvalue.it_value.tv_usec ) {
printf( "Real time interval timer mismatch\n" );
result = -1;
}
time( &t );
printf( "Before loop, time is %s", ctime(&t) );
for( count=0; ((count<LOOP_LIMIT) && (sigcount<2)); count++ );
time( &t );
printf( "After loop, time is %s\n", ctime(&t) );
if( sigcount == 0 )
printf( "The signal catcher never gained control\n" );
else
printf( "The signal catcher gained control\n" );
printf( "The value of count is %.0f\n", count );
return( result );
}
When this is compiled and executed (I save this as
getitimer.c)
Code:
make getitimer
getitimer
Before loop, time is Wed Apr 27 09:47:38 2011
Signal catcher called for signal 14
Signal catcher called for signal 14
After loop, time is Wed Apr 27 09:47:39 2011
The signal catcher gained control
The value of count is 212618176
If you try this one, the count will most likely not be the same as shown here (I'm on a 3.1GHz dual-core 64-bit machine, you mileage may vary).
In either case, you set up a signal catcher and use a function that will generate a signal when it completes; in the first example, the
alarm() function does that and the signal is caught.
Hope this helps some.