Ctrl C 不能中止程序问题

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值