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

📄 process.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "common.h"/* make a stream to a child process */extern stream *instream(void){	stream *rv;	int pfd[2];	if ((rv = (stream *)malloc(sizeof(stream))) == 0)		return 0;	memset(rv, 0, sizeof(stream));	if (pipe(pfd) < 0)		return 0;	if(Binit(&rv->bb, pfd[1], OWRITE) < 0){		close(pfd[0]);		close(pfd[1]);		return 0;	}	rv->fp = &rv->bb;	rv->fd = pfd[0];		return rv;}/* make a stream from a child process */extern stream *outstream(void){	stream *rv;	int pfd[2];	if ((rv = (stream *)malloc(sizeof(stream))) == 0)		return 0;	memset(rv, 0, sizeof(stream));	if (pipe(pfd) < 0)		return 0;	if (Binit(&rv->bb, pfd[0], OREAD) < 0){		close(pfd[0]);		close(pfd[1]);		return 0;	}	rv->fp = &rv->bb;	rv->fd = pfd[1];	return rv;}extern voidstream_free(stream *sp){	int fd;	close(sp->fd);	fd = Bfildes(sp->fp);	Bterm(sp->fp);	close(fd);	free((char *)sp);}/* start a new process */extern process *noshell_proc_start(char **av, stream *inp, stream *outp, stream *errp, int newpg, char *who){	process *pp;	int i, n;	if ((pp = (process *)malloc(sizeof(process))) == 0) {		if (inp != 0)			stream_free(inp);		if (outp != 0)			stream_free(outp);		if (errp != 0)			stream_free(errp);		return 0;	}	pp->std[0] = inp;	pp->std[1] = outp;	pp->std[2] = errp;	switch (pp->pid = fork()) {	case -1:		proc_free(pp);		return 0;	case 0:		if(newpg)			sysdetach();		for (i=0; i<3; i++)			if (pp->std[i] != 0){				close(Bfildes(pp->std[i]->fp));				while(pp->std[i]->fd < 3)					pp->std[i]->fd = dup(pp->std[i]->fd, -1);			}		for (i=0; i<3; i++)			if (pp->std[i] != 0)				dup(pp->std[i]->fd, i);		for (n = sysfiles(); i < n; i++)			close(i);		if(who)			become(av, who);		exec(av[0], av);		perror("proc_start");		exits("proc_start");	default:		for (i=0; i<3; i++)			if (pp->std[i] != 0) {				close(pp->std[i]->fd);				pp->std[i]->fd = -1;			}		return pp;	}}/* start a new process under a shell */extern process *proc_start(char *cmd, stream *inp, stream *outp, stream *errp, int newpg, char *who){	char *av[4];	av[0] = SHELL;	av[1] = "-c";	av[2] = cmd;	av[3] = 0;	return noshell_proc_start(av, inp, outp, errp, newpg, who);}/* wait for a process to stop */extern intproc_wait(process *pp){	Waitmsg *status;	char err[Errlen];	for(;;){		status = wait();		if(status == nil){			errstr(err, sizeof(err));			if(strstr(err, "interrupt") == 0)				break;		}		if (status->pid==pp->pid)			break;	}	pp->pid = -1;	if(status == nil)		pp->status = -1;	else		pp->status = status->msg[0];	pp->waitmsg = status;	return pp->status;}/* free a process */extern intproc_free(process *pp){	int i;	if(pp->std[1] == pp->std[2])		pp->std[2] = 0;		/* avoid freeing it twice */	for (i = 0; i < 3; i++)		if (pp->std[i])			stream_free(pp->std[i]);	if (pp->pid >= 0)		proc_wait(pp);	free(pp->waitmsg);	free((char *)pp);	return 0;}/* kill a process */extern intproc_kill(process *pp){	return syskill(pp->pid);}

⌨️ 快捷键说明

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