Chinaunix首页 | 论坛 | 博客
  • 博客访问: 806252
  • 博文数量: 244
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 2420
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-29 09:07
文章分类

全部博文(244)

文章存档

2011年(4)

2010年(3)

2009年(72)

2008年(119)

2007年(46)

我的朋友

分类: LINUX

2007-11-05 09:27:27

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

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

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

Ctrl + C首先通过 /dev/ttyS0 (/dev/console)driver,这个serial driver直接把这个控制字符送到n_ttydrivern_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->pgrptask.值得一提的是,只要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

这边我们要关注一下busyboxinittab文件的格式:

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

 

最后我还是要推荐两位网友的blog

http://www.cnitblog.com/zouzheng/

http://blog.chinaunix.net/u/24474/showart_231571.html
http://blog.csdn.net/zjujoe/archive/2008/10/27/3158344.aspx#938755

开始研究 getty 自动登录, 从:

得到答案:

修改inittab respawn 一行

T0:2345:respawn: /sbin/getty -n -l /bin/autologin 115200 ttyS2 vt100

并创建可执行文件:/bin/autologin

#!/bin/sh

/bin/login -f root


阅读(1444) | 评论(0) | 转发(0) |
0

上一篇:sed 的使用方法

下一篇:locale详解

给主人留下些什么吧!~~