console.cc

来自「一个mips虚拟机非常好代码,使用C++来编写的,希望大家多学学,」· CC 代码 · 共 78 行

CC
78
字号
#include <unistd.h>#include <fcntl.h>#include <termios.h>#include "module.hh"#include "sulima.hh"#include <signal.h>static char *console_dev;static Console *console;static struct termios orig_termios;static bool restore_termios = false;static const int poll_interval = 0x10000;// Initialize the console subsystem.voidSulima::create_console_subsystem(){    // Link related variables.     define("console", console_dev);}voidSulima::enable_console(CPU *cpu){    struct termios termios;    sigset_t block_ttou;         sigemptyset (&block_ttou);    sigaddset (&block_ttou, SIGTTOU);    if ((console_dev == NULL) || (*console_dev == 0))	return;    console = dynamic_cast<Console *>(find_module(console_dev));    if (!console) {    	throw Error("\"%#s\" is not a Console module.", console_dev);    }        io_fd = STDIN_FILENO;    if (tcgetattr(io_fd, &orig_termios) != -1) {	termios = orig_termios;	termios.c_iflag &= ~(INLCR|ICRNL);	termios.c_lflag &= ~(ICANON|ECHO);	/*block SIGTTOU to enable using tcsetattr() from backgroud processes, RitaShen*/	sigprocmask (SIG_BLOCK, &block_ttou, NULL);	if (tcsetattr(io_fd, TCSANOW, &termios) != -1) 	    restore_termios = true;	/*recover SIGTTOU*/	sigprocmask (SIG_UNBLOCK, &block_ttou, NULL);    }        ioqueue->insert(this);}// Destroy the subsystem.voidSulima::destroy_console_subsystem(){    ioqueue->remove(this);    if (restore_termios)	tcsetattr(STDIN_FILENO, TCSANOW, &orig_termios);}voidSulima::io_poll(){    unsigned char c;    int len;    len = read(io_fd, &c, 1);    if ((len > 0) && (console != NULL))	console->input((int)c);}

⌨️ 快捷键说明

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