您的位置:首页 > 运维架构 > Shell

android shell 不支持tab ctrl C的问题

2013-09-30 11:58 381 查看
关于ctrl+C无法结束程序的问题,原因在这里,不过这里的方法不能用在android上

在最近的一段时间中,发现在busybox下调试时,shell终端用ctrl+c不能终止掉正在运行的进程。参考了网上的一些网友的blog的解决方法以及自己的理解,这边把解决方法告诉大家。

Ctrl+C终止进程的流程是这样的:

Ctrl + C首先通过 /dev/ttyS0 (/dev/console)的driver,这个serial driver直接把这个控制字符送到n_tty的driver,n_tty负责search所有的控制字符。

当 ctrl+C 按下,

n_tty.c: n_tty_receive_break() –> isig(SIGINT,tty) –> kill_pg(SIGINT, tty->pgrp)

signal.c: kill_pg() calls signal(SIGINT,task) 来中断每个具有group number 为 tty->pgrp的task.值得一提的是,只要process具有相同的group id,不管是backgroud还是foreground,都会被kill掉

从上面的流程我们可以看到,ctrl+C是传送到/dev/ttyS0中的驱动中的。在我原来的文件系统中,建立了节点console作为系统控制台。但是没有ttyS0节点。这样系统运行起来后,shell的交互是通过console这个控制台的。但是在busybox的手册中有这样的一段话:

Why do I keep getting "sh: can't access tty; job control turned off" errors? Why doesn't Control-C work within my shell?

This isn't really a uClibc question, but I'll answer it here anyways. Job control will be turned off since your shell can not obtain a controlling terminal. This typically happens when you run your shell on /dev/console. The kernel will not provide a controlling
terminal on the /dev/console device. Your should run your shell on a normal tty such as tty1 or ttyS0 and everything will work perfectly. If you REALLY want your shell to run on /dev/console, then you can hack your kernel (if you are into that sortof thing)
by changing drivers/char/tty_io.c to change the lines where it sets "noctty = 1;" to instead set it to "0". I recommend you instead run your shell on a real console...

显然,busybox建议我们shell最好运行在实际的控制台上,例如tty或是ttyS0中。

所以我们解决方法如下:

1. 在dev目录下建立ttyS0的节点:

#mknod –m 666 ttyS0 c 4 64

2. 然后我们将系统控制台console链接到ttyS0中

# ln –s ttyS0 console

3. 修改启动文件/etc/inittab

console::sysinit:-/etc/rcS

ttyS0::respawn:-/bin/sh
到此为止,重新***文件系统,下载到目标板,测试



解决办法在这里

修改system/core/init/init.c 里面的

static char *console_name = "/dev/ttyS2";

这里以前是/dev/console,

重新编译:

source build/envsetup.sh

mmm system/core/init/

把编译出来的init放到内核里面的root目录,

重 新做一个内核烧进去,

这样就可以支持ctrl+c了,

当然前提是/dev/ttyS2确实是串口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: