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

📄 popen.c

📁 操作系统源代码
💻 C
字号:
/* * popen - open a pipe *//* $Header: popen.c,v 1.3 90/08/28 14:53:34 eck Exp $ */#include	<sys/types.h>#include	<limits.h>#include	<errno.h>#include	<signal.h>#include	<stdio.h>#if	defined(__BSD4_2)union wait {	int	w_status;};typedef union wait wait_arg;#elsetypedef int wait_arg;#endif	/* __BSD4_2 */#include	"../stdio/loc_incl.h"#ifdef _ANSIint _close(int d);int _dup2(int oldd, int newd);		/* not present in System 5 */int _execl(const char *name, const char *_arg, ... );pid_t _fork(void);int _pipe(int fildes[2]);pid_t _wait(wait_arg *status);void _exit(int status);#endifstatic int pids[OPEN_MAX];FILE *popen(command, type)_CONST char *command;_CONST char *type;{	int piped[2];	int Xtype = *type == 'r' ? 0 : *type == 'w' ? 1 : 2;	int pid;	if (Xtype == 2 ||	    _pipe(piped) < 0 ||	    (pid = _fork()) < 0) return 0;		if (pid == 0) {		/* child */		register int *p;		for (p = pids; p < &pids[OPEN_MAX]; p++) {			if (*p) _close((int)(p - pids));		}		_close(piped[Xtype]);		_dup2(piped[!Xtype], !Xtype);		_close(piped[!Xtype]);		_execl("/bin/sh", "sh", "-c", command, (char *) 0);		_exit(127);	/* like system() ??? */	}	pids[piped[Xtype]] = pid;	_close(piped[!Xtype]);	return fdopen(piped[Xtype], type);}#if	defined(__BSD4_2)#define	ret_val	status.w_status#else#define	ret_val	status#endifintpclose(stream)FILE *stream;{	int fd = fileno(stream);	wait_arg status;	int wret;#ifdef _ANSI	void (*intsave)(int) = signal(SIGINT, SIG_IGN);	void (*quitsave)(int) = signal(SIGQUIT, SIG_IGN);#else	void (*intsave)() = signal(SIGINT, SIG_IGN);	void (*quitsave)() = signal(SIGQUIT, SIG_IGN);#endif	fclose(stream);	while ((wret = _wait(&status)) != -1) {		if (wret == pids[fd]) break;	}	if (wret == -1) ret_val = -1;	signal(SIGINT, intsave);	signal(SIGQUIT, quitsave);	pids[fd] = 0;	return ret_val;}#if	defined(__USG)int _dup(int fildes);static int_dup2(oldd, newd)int oldd, newd;{	int i = 0, fd, tmp;	int fdbuf[_NFILES];	/* ignore the error on the close() */	tmp = errno; (void) _close(newd); errno = tmp;	while ((fd = _dup(oldd)) != newd) {		if (fd == -1) break;		fdbuf[i++] = fd;	}	tmp = errno;	while (--i >= 0) {		_close(fdbuf[i]);	}	errno = tmp;	return -(fd == -1);}#endif	/* __USG */

⌨️ 快捷键说明

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