Do not try to make the scheduler preemptive.
Test your program with a pair of application threads based on the following pseudocode:
thread1: semaphore d is initially 0
repeat
at( now + 10 seconds, d )
wait( d )
output control g to standard error
relinquish
forever
thread2: repeat
relinquish
read a line of input from standard input
relinquish
echo the line to standard output
forever
Use the standard C library I/O routines. Do not try to fix any anomolous
behavior of the result