BSD vs. Sys V alarm and SIGALRM PROBLEMS!

catherine susch cats at lamont.ldgo.columbia.edu
Wed Feb 6 02:46:27 AEST 1991



	We believe that we've discovered a problem/bug with 
	the alarm(3) function and signal(2). Give us your 
	feedback if you	think otherwise, because we think 
	that this is a major problem that needs fixing. 

HERE IT IS:

	We've been trying  to write a timeout  procedure so  that
	if the application  is  waiting  for input  and  the user 
	decides to  take a nap,  beep at him to  type  something,
	and if he doesn't, then exit.

	The system we're using is SunOS 4.0.3  and  the application
	is written using AT&T system 5 curses.
	
	In SunOS 3.5 we used the following test code fragment which 
	will give the desired results:



------------------------------------------------------------------------
	#include <stdio.h>
	#include <signal.h>
	#include <errno.h>
	#include <sys/time.h>

	void	new_alarm();
	void	last_alarm();
	void	bad();

	main()
	{
		int inp;

	/* start alarm and wait for input	*/
		alarm(10); 
		signal(SIGALRM, new_alarm);   
		printf("waiting for input\n");
		inp = getchar();

	/* If input was recieved you should get here	*/

		printf("got input\n bye\n");
		signal(SIGALRM, SIG_IGN);
		exit(0);
}

void	new_alarm()
{
	/* start a new alarm and set a new handler for SIGALRM to 
	   quit if still no input received			*/

	alarm(20); 
	signal(SIGALRM, last_alarm);
	printf("alarm has sounded and new alarm is set\n");
}

void	last_alarm()
{
	printf("no input recieved, exiting program\n");
	exit(-1);
}
------------------------------------------------------------------


   Under all BSD versions it also works the same as SunOS 3.5.
   Under SunOS 4.0.3 and 4.1.1, however, this routine has very different
   results:
	
	The signal call

		signal(SIGALRM, last_alarm),

	inside the handler new_alarm(), never gets set and thus
	the program never gets to last_alarm().  It acts  as if 
	input was received when it wasn't.

	When the routine is incorporated  into an  application  with
	cursesV  calls, once an alarm sounds, it goes into new_alarm() and
	returns without resetting either signal or alarm. This causes it
	to call new_alarm over and over again until input is received.
	
   So here's our question:

		Is this a bug? 

		Has anyone ever encountered this?

		WHAT IS REALLY SUPPOSED TO HAPPEN UNDER SYSTEM 5???????

		Furthermore, is anyone aware of a workaround?

	Please email responses, since we are so preoccupied with
	this problem we may have trouble reading this newsgroup.
	I will post a summary if there is interest.


Cat


________________________________________________________________________________
 	 ______     ___      _________     | 
 	/          /   \         /         |	Catherine Ann Teresa Susch
       /	  /     \       /	   |	Lamont-Doherty Geo. Observatory
      /		 /_______\     /	   |	of Columbia University
     /_______   /         \   /    __	   |	Palisades,N.Y. 10964  USA
				  /__	   |    
				  __/	   |	cats at lamont.ldgo.columbia.edu
___________________________________________|____________________________________



More information about the Comp.unix.internals mailing list