1、退出快捷键
大家在用Qemu时经常会遇到要退出的情况。一般做法是使用ps或者lsof等命令找出qemu的进程ID,使用KILL命令杀死,该做法相当繁琐。实质上,Qemu已经设计了退出的快捷键:按下ctrl+a,之后按大写X。
2、代码分析
Qemu的所有交互输入时通过字符设备来实现的。具体退出的检查在路径“chardev/char-mux.c”文件的函数mux_proc_byte中。
/* ctrl+a 按键的标志位 */
int term_escape_char = 0x01; /* ctrl-a is used for escape */
static int mux_proc_byte(Chardev *chr, MuxChardev *d, int ch)
{
if (d->term_got_escape) {
d->term_got_escape = 0;
if (ch == term_escape_char) {
goto send_char;
}
switch (ch) {
case '?':
case 'h':
mux_print_help(chr);
break;
/* 如果已经识别到输入了ctrl+a,检查是否输入了x字符。若是,则执行Qemu退出的流程 */
case 'x':
{
const char *term = "QEMU: Terminated\n\r";
qemu_chr_write_all(chr, (uint8_t *)term, strlen(term));
qmp_quit(NULL);
break;
}
case 's':
blk_commit_all();
break;
case 'b':
qemu_chr_be_event(chr, CHR_EVENT_BREAK);
break;
case 'c':
assert(d->mux_cnt > 0); /* handler registered with first fe */
/* Switch to the next registered device */
mux_set_focus(chr, (d->focus + 1) % d->mux_cnt);
break;
case 't':
d->timestamps = !d->timestamps;
d->timestamps_start = -1;
d->linestart = 0;
break;
}
} else if (ch == term_escape_char) {
d->term_got_escape = 1;
} else {
send_char:
return 1;
}
return 0;
}
版权声明:本文为Loyal1992原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。