Click on rand2.c to get source.
#include <stdio.h>
#include <stdlib.h>
/* more on John's question why the program cannot probe if
the keyboard was struck:
The GUI library is Unix's X-windows, and we run our program
in an xterm. The X-windows library provides an interupt
handler for the keyboard, and we will use it in Java.
However, the xterm program does not pass the keyboard interrupts
to the currently running program. Instead, it displays
the struck keys on the line, and when a newline is struck
it places them in a buffer that the program can read. This
is why you can edit your input line before hitting return.
In no way does it signal new buffer contents to the running
program.
xterm passes certain interrupts through to your program:
if you strike ^C (control-C), an interrupt signal is sent.
^Z (control-Z), a terminal stop (suspend)
signal is sent.
In the code below, I catch both signals before exiting.
*/
#include <signal.h>
void my_SIGINT_handler(int sig) /* interrupt by ^C */
{/* psignal(sig, "in main()"); /* print message; not standard C */
fprintf(stderr,"In my main() in rand2.c: %d\n\n",sig);
exit(1);
}
void my_SIGTSTP_handler(int sig) /* terminal stop by ^Z */
{/* psignal(sig, "in main()"); /* print message; not standard C */
fprintf(stderr,"In my main() in rand2.c: %d\n\n",sig);
exit(1); /* should suspend here and wait for SIGCONT signal */
}
int main(void){
int i;
/* variables that hold pointers to functions */
void (*sys_SIGINT_handler_ptr)();
void (*sys_SIGTSTP_handler_ptr)();
/* activate signal handlers */
sys_SIGINT_handler_ptr = signal(SIGINT, &my_SIGINT_handler);
if( sys_SIGINT_handler_ptr == SIG_ERR)
fprintf(stderr, "?Couldn't establish new SIGINT handler.\n");
sys_SIGTSTP_handler_ptr = signal(SIGTSTP, &my_SIGTSTP_handler);
if( sys_SIGTSTP_handler_ptr == SIG_ERR)
fprintf(stderr, "?Couldn't establish new SIGTSTP handler.\n");
srand(101);
for (;;)
{for (i=0; i<30; i++)
/* print a random bit */
printf("%1d", 1 & rand());
printf("\n");
}
return 0;
}