Quizzer
view release on metacpan or search on metacpan
exercises/compile-tcsh/tcsh-6.10.00/sh.proc.c view on Meta::CPAN
#endif /* !BSDSIGS */
stderror(ERR_NOPROC);
}
if (pid == 0) {
settimes();
pgrp = pcurrjob ? pcurrjob->p_jobid : getpid();
pflushall();
pcurrjob = NULL;
#if !defined(BSDTIMES) && !defined(_SEQUENT_)
timesdone = 0;
#endif /* !defined(BSDTIMES) && !defined(_SEQUENT_) */
child++;
if (setintr) {
setintr = 0; /* until I think otherwise */
#ifndef BSDSIGS
if (wanttty < 0)
(void) sigrelse(SIGCHLD);
#endif /* !BSDSIGS */
/*
* Children just get blown away on SIGINT, SIGQUIT unless "onintr
* -" seen.
*/
(void) signal(SIGINT, ignint ? SIG_IGN : SIG_DFL);
(void) signal(SIGQUIT, ignint ? SIG_IGN : SIG_DFL);
#ifdef BSDJOBS
if (wanttty >= 0) {
/* make stoppable */
(void) signal(SIGTSTP, SIG_DFL);
(void) signal(SIGTTIN, SIG_DFL);
(void) signal(SIGTTOU, SIG_DFL);
}
#endif /* BSDJOBS */
(void) signal(SIGTERM, parterm);
}
else if (tpgrp == -1 && (t->t_dflg & F_NOINTERRUPT)) {
(void) signal(SIGINT, SIG_IGN);
(void) signal(SIGQUIT, SIG_IGN);
}
#ifdef OREO
sigignore(SIGIO); /* ignore SIGIO in child too */
#endif /* OREO */
pgetty(wanttty, pgrp);
/*
* Nohup and nice apply only to NODE_COMMAND's but it would be nice
* (?!?) if you could say "nohup (foo;bar)" Then the parser would have
* to know about nice/nohup/time
*/
if (t->t_dflg & F_NOHUP)
(void) signal(SIGHUP, SIG_IGN);
if (t->t_dflg & F_NICE) {
int nval = SIGN_EXTEND_CHAR(t->t_nice);
#ifdef BSDNICE
(void) setpriority(PRIO_PROCESS, 0, nval);
#else /* !BSDNICE */
(void) nice(nval);
#endif /* !BSDNICE */
}
#ifdef F_VER
if (t->t_dflg & F_VER) {
tsetenv(STRSYSTYPE, t->t_systype ? STRbsd43 : STRsys53);
dohash(NULL, NULL);
}
#endif /* F_VER */
#ifdef SIGSYNCH
/* rfw 8/89 now parent can continue */
if (kill(getppid(), SIGSYNCH))
stderror(ERR_SYSTEM, "pfork child: kill", strerror(errno));
#endif /* SIGSYNCH */
}
else {
#ifdef POSIXJOBS
if (wanttty >= 0) {
/*
* `Walking' process group fix from Beto Appleton.
* (beto@aixwiz.austin.ibm.com)
* If setpgid fails at this point that means that
* our process leader has died. We flush the current
* job and become the process leader ourselves.
* The parent will figure that out later.
*/
pgrp = pcurrjob ? pcurrjob->p_jobid : pid;
if (setpgid(pid, pgrp) == -1 && errno == EPERM) {
pcurrjob = NULL;
/*
* We don't care if this causes an error here;
* then we are already in the right process group
*/
(void) setpgid(pid, pgrp = pid);
}
}
#endif /* POSIXJOBS */
palloc(pid, t);
#ifdef SIGSYNCH
/*
* rfw 8/89 Wait for child to own terminal. Solves half of ugly
* synchronization problem. With this change, we know that the only
* reason setpgrp to a previous process in a pipeline can fail is that
* the previous process has already exited. Without this hack, he may
* either have exited or not yet started to run. Two uglies become
* one.
*/
(void) sigpause(omask & ~SYNCHMASK);
if (mysigvec(SIGSYNCH, &osv, NULL))
stderror(ERR_SYSTEM, "pfork parent: sigvec restore",
strerror(errno));
#endif /* SIGSYNCH */
if (wanttty < 0) {
#ifdef BSDSIGS
(void) sigsetmask(omask);
#else /* !BSDSIGS */
(void) sigrelse(SIGCHLD);
#endif /* !BSDSIGS */
}
}
return (pid);
}
static void
( run in 1.009 second using v1.01-cache-2.11-cpan-0b5f733616e )