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

📄 main.c

📁 该代码为unix环境高级编程的源代码
💻 C
字号:
#include	<sys/types.h>#include	<termios.h>#ifndef	TIOCGWINSZ#include	<sys/ioctl.h>	/* 44BSD requires this too */#endif#include	"ourhdr.h"static void	set_noecho(int);	/* at the end of this file */void		do_driver(char *);	/* in the file driver.c */void		loop(int, int);		/* in the file loop.c */intmain(int argc, char *argv[]){	int				fdm, c, ignoreeof, interactive, noecho, verbose;	pid_t			pid;	char			*driver, slave_name[20];	struct termios	orig_termios;	struct winsize	size;	interactive = isatty(STDIN_FILENO);	ignoreeof = 0;	noecho = 0;	verbose = 0;	driver = NULL;	opterr = 0;		/* don't want getopt() writing to stderr */	while ( (c = getopt(argc, argv, "d:einv")) != EOF) {		switch (c) {		case 'd':		/* driver for stdin/stdout */			driver = optarg;			break;		case 'e':		/* noecho for slave pty's line discipline */			noecho = 1;			break;		case 'i':		/* ignore EOF on standard input */			ignoreeof = 1;			break;		case 'n':		/* not interactive */			interactive = 0;			break;		case 'v':		/* verbose */			verbose = 1;			break;		case '?':			err_quit("unrecognized option: -%c", optopt);		}	}	if (optind >= argc)		err_quit("usage: pty [ -d driver -einv ] program [ arg ... ]");	if (interactive) {	/* fetch current termios and window size */		if (tcgetattr(STDIN_FILENO, &orig_termios) < 0)			err_sys("tcgetattr error on stdin");		if (ioctl(STDIN_FILENO, TIOCGWINSZ, (char *) &size) < 0)			err_sys("TIOCGWINSZ error");		pid = pty_fork(&fdm, slave_name, &orig_termios, &size);	} else		pid = pty_fork(&fdm, slave_name, NULL, NULL);	if (pid < 0)		err_sys("fork error");	else if (pid == 0) {		/* child */		if (noecho)			set_noecho(STDIN_FILENO);	/* stdin is slave pty */		if (execvp(argv[optind], &argv[optind]) < 0)			err_sys("can't execute: %s", argv[optind]);	}	if (verbose) {		fprintf(stderr, "slave name = %s\n", slave_name);		if (driver != NULL)			fprintf(stderr, "driver = %s\n", driver);	}	if (interactive && driver == NULL) {		if (tty_raw(STDIN_FILENO) < 0)	/* user's tty to raw mode */			err_sys("tty_raw error");		if (atexit(tty_atexit) < 0)		/* reset user's tty on exit */			err_sys("atexit error");	}	if (driver)		do_driver(driver);	/* changes our stdin/stdout */	loop(fdm, ignoreeof);	/* copies stdin -> ptym, ptym -> stdout */	exit(0);}static voidset_noecho(int fd)		/* turn off echo (for slave pty) */{	struct termios	stermios;	if (tcgetattr(fd, &stermios) < 0)		err_sys("tcgetattr error");	stermios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);	stermios.c_oflag &= ~(ONLCR);			/* also turn off NL to CR/NL mapping on output */	if (tcsetattr(fd, TCSANOW, &stermios) < 0)		err_sys("tcsetattr error");}

⌨️ 快捷键说明

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