⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sem.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
		    else if (tpgrp == -1 &&			     (t->t_dflg & F_NOINTERRUPT)) {			(void) signal(SIGINT, SIG_IGN);			(void) signal(SIGQUIT, SIG_IGN);		    }		    pgetty(wanttty, pgrp);		    if (t->t_dflg & F_NOHUP)			(void) signal(SIGHUP, SIG_IGN);		    if (t->t_dflg & F_NICE)			(void) setpriority(PRIO_PROCESS, 0, t->t_nice);		}	    }	if (pid != 0) {	    /*	     * It would be better if we could wait for the whole job when we	     * knew the last process had been started.  Pwait, in fact, does	     * wait for the whole job anyway, but this test doesn't really	     * express our intentions.	     */	    if (didfds == 0 && t->t_dflg & F_PIPEIN) {		(void) close(pipein[0]);		(void) close(pipein[1]);	    }	    if ((t->t_dflg & F_PIPEOUT) == 0) {		if (nosigchld) {		    (void) sigsetmask(csigmask);		    nosigchld = 0;		}		if ((t->t_dflg & F_AMPERSAND) == 0)		    pwait();	    }	    break;	}	doio(t, pipein, pipeout);	if (t->t_dflg & F_PIPEOUT) {	    (void) close(pipeout[0]);	    (void) close(pipeout[1]);	}	/*	 * Perform a builtin function. If we are not forked, arrange for	 * possible stopping	 */	if (bifunc) {	    func(t, bifunc);	    if (forked)		exitstat();	    break;	}	if (t->t_dtyp != NODE_PAREN) {	    doexec(NULL, t);	    /* NOTREACHED */	}	/*	 * For () commands must put new 0,1,2 in FSH* and recurse	 */	OLDSTD = dcopy(0, FOLDSTD);	SHOUT = dcopy(1, FSHOUT);	SHERR = dcopy(2, FSHERR);	(void) close(SHIN);	SHIN = -1;	didfds = 0;	wanttty = -1;	t->t_dspr->t_dflg |= t->t_dflg & F_NOINTERRUPT;	execute(t->t_dspr, wanttty, NULL, NULL);	exitstat();    case NODE_PIPE:	t->t_dcar->t_dflg |= F_PIPEOUT |	    (t->t_dflg & (F_PIPEIN | F_AMPERSAND | F_STDERR | F_NOINTERRUPT));	execute(t->t_dcar, wanttty, pipein, pv);	t->t_dcdr->t_dflg |= F_PIPEIN | (t->t_dflg &			(F_PIPEOUT | F_AMPERSAND | F_NOFORK | F_NOINTERRUPT));	if (wanttty > 0)	    wanttty = 0;	/* got tty already */	execute(t->t_dcdr, wanttty, pv, pipeout);	break;    case NODE_LIST:	if (t->t_dcar) {	    t->t_dcar->t_dflg |= t->t_dflg & F_NOINTERRUPT;	    execute(t->t_dcar, wanttty, NULL, NULL);	    /*	     * In strange case of A&B make a new job after A	     */	    if (t->t_dcar->t_dflg & F_AMPERSAND && t->t_dcdr &&		(t->t_dcdr->t_dflg & F_AMPERSAND) == 0)		pendjob();	}	if (t->t_dcdr) {	    t->t_dcdr->t_dflg |= t->t_dflg &		(F_NOFORK | F_NOINTERRUPT);	    execute(t->t_dcdr, wanttty, NULL, NULL);	}	break;    case NODE_OR:    case NODE_AND:	if (t->t_dcar) {	    t->t_dcar->t_dflg |= t->t_dflg & F_NOINTERRUPT;	    execute(t->t_dcar, wanttty, NULL, NULL);	    if ((getn(value(STRstatus)) == 0) !=		(t->t_dtyp == NODE_AND))		return;	}	if (t->t_dcdr) {	    t->t_dcdr->t_dflg |= t->t_dflg &		(F_NOFORK | F_NOINTERRUPT);	    execute(t->t_dcdr, wanttty, NULL, NULL);	}	break;    }    /*     * Fall through for all breaks from switch     *      * If there will be no more executions of this command, flush all file     * descriptors. Places that turn on the F_REPEAT bit are responsible for     * doing donefds after the last re-execution     */    if (didfds && !(t->t_dflg & F_REPEAT))	donefds();}static voidvffree(i)int i;{    register Char **v;    if ((v = gargv) != NULL) {	gargv = 0;	xfree((ptr_t) v);    }    if ((v = pargv) != NULL) {	pargv = 0;	xfree((ptr_t) v);    }    _exit(i);}/* * Expand and glob the words after an i/o redirection. * If more than one word is generated, then update the command vector. * * This is done differently in all the shells: * 1. in the bourne shell and ksh globbing is not performed * 2. Bash/csh say ambiguous * 3. zsh does i/o to/from all the files * 4. itcsh concatenates the words. * * I don't know what is best to do. I think that Ambiguous is better * than restructuring the command vector, because the user can get * unexpected results. In any case, the command vector restructuring  * code is present and the user can choose it by setting noambiguous */static Char *splicepipe(t, cp)    register struct command *t;    Char *cp;	/* word after < or > */{    Char *blk[2];    if (adrof(STRnoambiguous)) {	Char **pv;	blk[0] = Dfix1(cp); /* expand $ */	blk[1] = NULL;	gflag = 0, tglob(blk);	if (gflag) {	    pv = globall(blk);	    if (pv == NULL) {		setname(vis_str(blk[0]));		xfree((ptr_t) blk[0]);		stderror(ERR_NAME | ERR_NOMATCH);	    }	    gargv = NULL;	    if (pv[1] != NULL) { /* we need to fix the command vector */		Char **av = blkspl(t->t_dcom, &pv[1]);		xfree((ptr_t) t->t_dcom);		t->t_dcom = av;	    }	    xfree((ptr_t) blk[0]);	    blk[0] = pv[0];	    xfree((ptr_t) pv);	}    }    else {	blk[0] = globone(blk[1] = Dfix1(cp), G_ERROR);	xfree((ptr_t) blk[1]);    }    return(blk[0]);}/* * Perform io redirection. * We may or maynot be forked here. */static voiddoio(t, pipein, pipeout)    register struct command *t;    int    *pipein, *pipeout;{    register int fd;    register Char *cp;    register int flags = t->t_dflg;    if (didfds || (flags & F_REPEAT))	return;    if ((flags & F_READ) == 0) {/* F_READ already done */	if (t->t_dlef) {	    char    tmp[MAXPATHLEN+1];	    /*	     * so < /dev/std{in,out,err} work	     */	    (void) dcopy(SHIN, 0);	    (void) dcopy(SHOUT, 1);	    (void) dcopy(SHERR, 2);	    cp = splicepipe(t, t->t_dlef);	    (void) strncpy(tmp, short2str(cp), MAXPATHLEN);	    tmp[MAXPATHLEN] = '\0';	    xfree((ptr_t) cp);	    if ((fd = open(tmp, O_RDONLY)) < 0)		stderror(ERR_SYSTEM, tmp, strerror(errno));	    (void) dmove(fd, 0);	}	else if (flags & F_PIPEIN) {	    (void) close(0);	    (void) dup(pipein[0]);	    (void) close(pipein[0]);	    (void) close(pipein[1]);	}	else if ((flags & F_NOINTERRUPT) && tpgrp == -1) {	    (void) close(0);	    (void) open(_PATH_DEVNULL, O_RDONLY);	}	else {	    (void) close(0);	    (void) dup(OLDSTD);	    (void) ioctl(0, FIONCLEX, NULL);	}    }    if (t->t_drit) {	char    tmp[MAXPATHLEN+1];	cp = splicepipe(t, t->t_drit);	(void) strncpy(tmp, short2str(cp), MAXPATHLEN);	tmp[MAXPATHLEN] = '\0';	xfree((ptr_t) cp);	/*	 * so > /dev/std{out,err} work	 */	(void) dcopy(SHOUT, 1);	(void) dcopy(SHERR, 2);	if ((flags & F_APPEND) &&#ifdef O_APPEND	    (fd = open(tmp, O_WRONLY | O_APPEND)) >= 0);#else	    (fd = open(tmp, O_WRONLY)) >= 0)	    (void) lseek(1, (off_t) 0, L_XTND);#endif	else {	    if (!(flags & F_OVERWRITE) && adrof(STRnoclobber)) {		if (flags & F_APPEND)		    stderror(ERR_SYSTEM, tmp, strerror(errno));		chkclob(tmp);	    }	    if ((fd = creat(tmp, 0666)) < 0)		stderror(ERR_SYSTEM, tmp, strerror(errno));	}	(void) dmove(fd, 1);    }    else if (flags & F_PIPEOUT) {	(void) close(1);	(void) dup(pipeout[1]);    }    else {	(void) close(1);	(void) dup(SHOUT);	(void) ioctl(1, FIONCLEX, NULL);    }    (void) close(2);    if (flags & F_STDERR) {	(void) dup(1);    }    else {	(void) dup(SHERR);	(void) ioctl(2, FIONCLEX, NULL);    }    didfds = 1;}voidmypipe(pv)    register int *pv;{    if (pipe(pv) < 0)	goto oops;    pv[0] = dmove(pv[0], -1);    pv[1] = dmove(pv[1], -1);    if (pv[0] >= 0 && pv[1] >= 0)	return;oops:    stderror(ERR_PIPE);}static voidchkclob(cp)    register char *cp;{    struct stat stb;    if (stat(cp, &stb) < 0)	return;    if (S_ISCHR(stb.st_mode))	return;    stderror(ERR_EXISTS, cp);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -