#include #include int Interrupt=0; int Hot=0; struct resource { char *name; struct resource *next; } *Resources=0; extern int ConnectToServer(); extern struct resource *NewResource(char *); extern void FreeResources(); void handle() { Hot=0; /* Because FreeResources() isn't reentrant */ FreeResources(); sigset(SIGINT, SIG_DFL); kill(getpid(), SIGINT); } void remember(int signo) { if(Hot) { handle(); } else { Interrupt=1; } } void poll() { while(Interrupt) { Interrupt=0; handle(); } } ssize_t my_write(int fildes, char *buf, ssize_t nbyte) { ssize_t result; Hot=1; poll(); result=write(fildes, buf, nbyte); /* What if SIGINT is received right here? */ Hot=0; return result; } void AllocateResource(int server, char *name) { int done=0; do { char buf[1000]; sprintf(buf, "Create %s for me, please\n", name); if(my_write(server, name, strlen(name))==-1) { if(errno!=EINTR) { FreeResources(); sigset(SIGINT, SIG_DFL); poll(); exit(2); } } else { Resources=NewResource(name); done=1; } } while(!done); } int main() { int server; sigset(SIGINT, remember); server=ConnectToServer(); AllocateResource(server,"bob"); AllocateResource(server,"mary"); FreeResources(); return(0); }