Ctrl C 不能中止程序问题
来源:互联网 发布:世界级程序员 编辑:程序博客网 时间:2024/06/06 00:38
Ctrl C 不能中止程序问题
作者: zjujoe 转载请注明出处
Email:zjujoe@yahoo.com
BLOG:http://blog.csdn.net/zjujoe
最近应用组兄弟反应他们的环境(maemo)下 ctrl-c 不能终止程序,跟踪了一下,发现maemo 虽然也使用了 busybox, 但是 init 却是用的 sysvinit 包里面的。 试着更换成 busybox 的init, CtrlC 是可以终止程序的(比如 sleep 10)。 用 trap及stty 搞了一下, 也没有成功。
写一个测试程序, 收到信号时会打印信息:
#include <stdio.h>
#include <signal.h>
show_progress(unsigned long total, unsigned long cur)
{
static unsignedlong p = 0;
static constunsigned char w[] = "///-";
unsigned longval;
val = (cur *100) / total;
if(++p ==3) p = 0;
printf("/r%4d%c%c", val, '%', w[p]);
}
void sig_handle(int sig)
{
if (SIGINT == sig)
{
printf("hello!/n");
}
}
int main(void)
{
int i;
int j;
int k;
signal(SIGINT, sig_handle);
for (i=0; i<= 100; i++)
{
for (j=0; j<1000; j++)
for(k=0; k <10000; k++)
;
show_progress(100, i);
fflush(stdout);
}
printf("/n");
return 0;
}
内核跟踪发现串口 下按 ctrl-c 不会调用n_tty_receive_break,而是调用n_tty_receive_char, 在该函数中发出 INT2: http://lxr.linux.no/linux+v2.6.27/drivers/char/n_tty.c#L751.跟踪发现 INT 2 信号总是被发出的,奇怪的是后来没有被发送到当前进程(测试程序没有打印出 hello)
继续分析, 发现在系统启动时, 会打印一个错误信息:
/bin/sh: can't access tty; job control turned off
跟踪了 busybox, 发现函数tcgetpgrp 调用出错。
Google 一下, 似乎此类问题与Inittab 有关, 检查 /etc/inittab, 有一行:
S2:2345:respawn:/bin/sh
这个跟我们system fs 中 busybox init 使用的 /etc/inittab类似:
ttyS2::respawn:-/bin/sh
试着将 maemo fs 中的 /etc/inittab respawn 一行替换成上行, 系统不能启动。 可见此 init 非彼 init啊。
继续 google, 使用关键字 sysvinit, 加上前面的错误信息, 发现人家都是使用 getty.于是修改inittab respawn 一行如下:
T0:2345:respawn:/sbin/getty-L ttyS2 115200 vt100
此时登录时需要帐号,密码, 但是ctrl-c 可以正常工作。
开始研究 getty 自动登录, 从:
http://forum.ubuntu.org.cn/viewtopic.php?f=86&t=88847&start=0
得到答案:
修改inittab respawn 一行
T0:2345:respawn: /sbin/getty -n -l /bin/autologin 115200 ttyS2 vt100
并创建可执行文件:/bin/autologin
#!/bin/sh
/bin/login -froot
发现可以自动登录并且 ctrl-c 可以正常工作。
后记:在linuxforum上进行了提问,下午发现网友 nxin 也给了正确答案:
关键点是要有一个地方调用setsid(),加个getty就可以了,不过为什么不用busybox的init呢?
可见有问题要多问啊:P
- Ctrl C 不能中止程序问题
- Ctrl C 不能中止程序问题
- CTRL+C不能终止程序运行
- 不能想当然的ctrl+c ctrl+v
- ctrl+c不能终止进程
- 控制台程序Ctrl +C 退出
- Ubuntu terminal不能Ctrl V和 Ctrl C
- busybox ctrl+c不能终止进程(引用)
- word目录ctrl不能跟踪的问题
- tomcat的"ctrl + c" 问题
- 【讨论】控制台程序 Ctrl+C 异常问题 First-chance exception in ***.exe [Kernel32.dll].....
- Node.js程序出现不响应客户端请求问题(按“Ctrl+C"后恢复)
- WINDOWS console程序截获CTRL+C按键
- Win32控制台程序,忽略Ctrl+C
- Go程序如何安全退出(CTRL+C)
- windows 控制台程序 响应 Ctrl+C
- libuv程序,捕获Ctrl+C事件
- golang捕获ctrl+c退出程序
- ----log4j----按时间和大小增加新日志文件/输出多个自定义日志文件
- Head First C# 中文版 图文皆译 第二章 page66
- PreTranslateMessage解析(转)
- 大数据量分页存储过程效率测试附代码
- 用友U871存货成批复制工具
- Ctrl C 不能中止程序问题
- 大量Hash算法的实现
- 如何让两个div并排显示
- 重新注册了CSDN账号!老号丢了。
- PMP报考资格、报考程序及考试形式
- 第八课 装饰模式
- 关于学习 -- 写给初学者
- 对 SiteFactory™ CMS 生成静态页时分页错误的纠正
- Hibernate数据查询 (转帖)