void doit() { if (efork() == 0) { efork(); printf("hello\n"); exit(0); } return; }
int main() { if (efork() == 0) atexit(end); if (efork() == 0) { printf("0"); fflush(stdout); } else printf("1"); fflush(stdout); exit(0); }
int _schedexec(Execargs *e) { int pid; switch(pid = rfork(RFREND|RFNOTEG|RFFDG|RFMEM|RFPROC)){ case 0: efork(e); default: return pid; } }
void eval(char *cmdline) { char buf[MAXLINE]; char *argv[MAXARGS]; int bg, b; pid_t pid; strcpy(buf, cmdline); bg = parseline(buf, argv); if (argv[0] == NULL) return; if (b = builtin_cmd(argv)) return; else { child_block(); if ((pid = efork()) == 0) { signal(SIGINT, SIG_DFL); signal(SIGTSTP, SIG_DFL); signal(SIGCHLD, SIG_DFL); signal(SIGALRM, SIG_DFL); child_unblock(); if (execve(argv[0], argv, environ) < 0) { printf("%s : Command not found.\n", argv[0]); exit(0); } } addjob(pid, cmdline); setpgid(pid, pid); if (bg) { bg_job_info(pid); child_unblock(); return; } if (!bg) { forepid = pid; child_unblock(); fg_waitpid(pid); return; } child_unblock(); } return; }
/* forkexec -- fork (if necessary) and exec */ extern List *forkexec(char *file, List *list, Boolean inchild) { int pid, status; Vector *env; gcdisable(); env = mkenv(); pid = efork(!inchild, FALSE); if (pid == 0) { execve(file, vectorize(list)->vector, env->vector); failexec(file, list); } gcenable(); status = ewaitfor(pid); if ((status & 0xff) == 0) { sigint_newline = FALSE; SIGCHK(); sigint_newline = TRUE; } else SIGCHK(); printstatus(0, status); return mklist(mkterm(mkstatus(status), NULL), NULL); }