static int astYHandler (void) { struct child *c; for (c = children; c != 0; c = c->next) sys$delprc (&c->pid, 0, 0); ctrlYPressed= 1; kill (getpid(),SIGQUIT); return SS$_NORMAL; }
/* **++ ** ROUTINE: exit_handler ** ** FUNCTIONAL DESCRIPTION: ** ** Exit handler for the sp_mgr routines. Closes down the ** subprocesses and cleans up their SPB context blocks. ** ** RETURNS: cond_value, longword (unsigned), write only, by value ** ** PROTOTYPE: ** ** exit_handler(unsigned int *stat, struct QUE *spq) ** ** IMPLICIT INPUTS: None. ** ** IMPLICIT OUTPUTS: None. ** ** COMPLETION CODES: ** ** ** SIDE EFFECTS: None. ** **-- */ static unsigned int exit_handler (unsigned int *stat, struct QUE *spq) { SPHANDLE ctx; while(queue_remove(spq->head, &ctx)) { sys$delprc(&ctx->pid, 0); lib$free_ef(&ctx->termefn); lib$free_ef(&ctx->inefn); lib$free_ef(&ctx->outefn); sys$dassgn(ctx->inchn); sys$dassgn(ctx->outchn); lib$free_vm(&ctx->bufsiz, &ctx->bufptr); lib$free_vm(&spb_size, &ctx); } return SS$_NORMAL; } /* exit_handler */
/* **++ ** ROUTINE: sp_close ** ** FUNCTIONAL DESCRIPTION: ** ** Close down a subprocess. ** ** RETURNS: cond_value, longword (unsigned), write only, by value ** ** PROTOTYPE: ** ** sp_close(SPHANDLE *ctxpp) ** ** IMPLICIT INPUTS: None. ** ** IMPLICIT OUTPUTS: None. ** ** COMPLETION CODES: ** SS$_NORMAL: Normal successful completion. ** ** SIDE EFFECTS: None. ** **-- */ unsigned int sp_close (SPHANDLE *ctxpp) { SPHANDLE ctx; struct SPD *spd; unsigned int status; ctx = *ctxpp; /* ** Unlink the context block from our tracking queue */ status = sys$setast(0); queue_remove(ctx, &ctx); while (queue_remove(ctx->sendque.head, &spd)) free_spd(spd); if (status == SS$_WASSET) sys$setast(1); /* ** Delete the subprocess */ sys$forcex(&ctx->pid, 0, SS$_NORMAL); sys$delprc(&ctx->pid, 0); /* ** Wait till it actually dies */ sys$waitfr(ctx->termefn); /* ** Clean up and return */ lib$free_ef(&ctx->termefn); lib$free_ef(&ctx->inefn); lib$free_ef(&ctx->outefn); sys$dassgn(ctx->inchn); sys$dassgn(ctx->outchn); lib$free_vm(&ctx->bufsiz, &ctx->bufptr); lib$free_vm(&spb_size, &ctx); return SS$_NORMAL; } /* sp_close */