/* * do_bgfg - Execute the builtin bg and fg commands */ void do_bgfg(char **argv) { if (argv[1] == NULL) { printf("%s command requires PID or %%jobid argument\n", argv[0]); return; } if (!isdigit(argv[1][0]) && argv[1][0] != '%') { printf("%s: argument must be a PID or %%jobid\n", argv[0]); return; } if (argv[1][0] == '%' ? 1 : 0) { if (getjobjid(jobs, atoi(&argv[1][1])) == NULL) { printf("%s: No such job\n", argv[1]); return; } } else { if (getjobjid(jobs, atoi(&argv[1][1])) == NULL) { printf("(%d): No such process\n", atoi(argv[1])); return; } } // This is my favourite code __kill(-getjobjid(jobs, atoi(&argv[1][1]))->pid, SIGCONT); getjobjid(jobs, atoi(&argv[1][1]))->state = strcmp(argv[0], "fg")==0?FG:BG; if (strcmp(argv[0], "fg")==0) waitfg(getjobjid(jobs, atoi(&argv[1][1]))->pid); else printf("[%d] (%d) %s", getjobjid(jobs, atoi(&argv[1][1]))->jid, getjobjid(jobs, atoi(&argv[1][1]))->pid, getjobjid(jobs, atoi(&argv[1][1]))->cmdline); }
static void segfault(int code, unsigned long error, void *addr) { kprintf("Segmentation fault: %s mode %s at 0x%p%s\n", (error & PGF_USER) ? "user" : "kernel", (error & PGF_WRITE) ? "write" : "read", addr, (error & PGF_PERM) ? "" : " (page not present)"); dump_context(current->esp); if (is_kernel_context(current->esp)) panic("Segfault in kernel"); __kill(current, SIGSEGV, code); }
void __pthread_abort(void) { PTHREAD_NORETURN void (*_libc_abort)(void); _libc_abort = dlsym(RTLD_DEFAULT, "abort"); if (_libc_abort) { _libc_abort(); } else { __kill(__getpid(), __SIGABRT, 0); } }
void exn_ill_instr(void) { kprintf("Illegal instruction\n"); __kill(current, SIGILL, ILL_ILLOPC); // FIXME: determine correct code }
void exn_fpe(void) { kprintf("Arithmetic error\n"); __kill(current, SIGFPE, FPE_INTDIV); // TODO: more codes }
/* Raise the signal SIG. */ int raise (int sig) { return __kill (__getpid (), sig); }