九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 4224|回复: 2
打印 上一主题 下一主题

ctrl c不能终止进程(busybox提示can't access tty.job control

[复制链接]
跳转到指定楼层
楼主
发表于 2011-12-22 14:59:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在最近的一段时间中,发现在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
这边我们要关注一下busybox的inittab文件的格式:
Id:runlevel: action :process
其中的Id是用来指定启动的控制台的。
到此为止,重新制作文件系统,下载到目标板,测试:

# ping 192.168.2.245
PING 192.168.2.245 (192.168.2.245): 56 data bytes
64 bytes from 192.168.2.245: icmp_seq=0 ttl=64 time=2.1 ms
64 bytes from 192.168.2.245: icmp_seq=1 ttl=64 time=0.6 ms
64 bytes from 192.168.2.245: icmp_seq=2 ttl=64 time=0.4 ms
64 bytes from 192.168.2.245: icmp_seq=3 ttl=64 time=0.4 ms

--- 192.168.2.245 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.4/0.8/2.1 ms
#

测试通过!!
网上还有介绍其他的方法如下:
修改内核源码
在内核源码drivers/char/tty_io.c中将
noctty = 1改为noctty = 0
然后/etc/inittab可以使用默认的,也可以写成:
console::sysinit:-/etc/rcS
console::respawn:-/bin/sh

回复

使用道具 举报

沙发
发表于 2012-3-1 10:02:42 | 只看该作者
这个方法在x210上试过吗?
回复 支持 反对

使用道具 举报

板凳
发表于 2017-11-6 16:18:45 | 只看该作者
顶一下 x210V3 通过修改内核源码解决了问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-5-4 16:28 , Processed in 0.018266 second(s), 17 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表