#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <signal.h>
volatile int io_happened;
void handle_io(int xxx)
{ io_happened=1; }
int A(int m, int n)
{ if (m==0) return n+1;
if (n==0) return A(m-1, 1);
return A(m-1, A(m, n-1)); }
int long_computation(int m, int n)
{ return A(m,n); }
void main(int argc, char * argv[])
{ int m=3, n=10;
io_happened=0;
if (argc>2) { m=atol(argv[1]); n=atol(argv[2]); }
printf("m=%d, n=%d\n", m, n);
printf("f(m,n)=%d\n", long_computation(m, n));
termios buf;
tcgetattr(0, &buf);
buf.c_lflag &= ~(ECHO | ICANON);
buf.c_cc[VMIN]=1;
buf.c_cc[VTIME]=0;
tcsetattr(0, TCSAFLUSH, &buf);
signal(SIGIO, handle_io);
int savedflags=fcntl(0, F_GETFL, 0);
fcntl(0, F_SETFL, savedflags | O_ASYNC | O_NONBLOCK );
fcntl(0, F_SETOWN, getpid());
while (1)
{
printf(".");
fflush(stdout);
long_computation(m, n);
if (io_happened)
{ int c=getchar();
printf(" IO(%c) ", c^32);
fflush(stdout);
io_happened=0; } }
printf("\nAll Done\n"); }