2013-02-04 60 views
0

我试过在ubuntu中编写信号处理函数。该代码是下面的:Ubuntu中的信号处理功能11.04

#include<signal.h> 
    void abc(); 

    main(){ 

    printf("Press Ctrl-z key to send SIGINT signal"); 
    signal(SIGINT,abc); 
    for(;;); 
    } 
    void abc(){ 
    printf("The key has been pressed"); 
    } 

的野趣因素是: a)首先printf()的未示出 b)中除了第二个printf();

我写了一本书的代码。任何人都可以告诉我我犯了什么错误,或者代码是否会被改变为Ubuntu。

Thanx提前。

回答

0

stdout是行缓冲。

你可能想追加一个\n传递给printf()字符串:

printf("The key has been pressed.\n"); 

如果Crtl-C按下SIGINT被发送到前台运行的进程。 SIGINT的默认处理程序结束应用程序。

由于OP的应用安装SIGINT的信号处理不结束应用程序,它会继续,如果Ctrl-C按下并因此SIGINT提高运行。只要它保持安装状态,它就会在Ctl-C上被调用。

,以获得具有abc()的调用一次的行为,修改信号处理程序如下:

void abc(int sig) /* 'sig' gets the signal nuber passed in (here: 'SIGINT') */ 
{ 
    printf("The key has been pressed.\n"); 
    signal(sig, SIG_DFT); /* (re-)sets the signal handler for `sig` to the default handler. */ 
} 

进一步阅读:man signalman sigaction

+0

非常感谢你。但是你的回答和程序的输出引出了几个问题:你能否回答:a)放置\ n来执行我所做的信号功能的逻辑是什么? b)只要按下ctrl-c,我的输出就会继续显示DEL按下。它终止我按ctrl-z。但我的逻辑说,“按下DEL”会显示一次,如果我按ctl-c它会终止。你能否解释背后的逻辑?再次,非常感谢。 – user2015915

+0

@ user2015915听起来像你一直在搞'stty' ......“通常”,'SIGINT',对应于'ctrl-c',而不是'ctrl-z'(通常意味着'SIGTSTP'),' DEL'与信号无关。这里并不清楚你到底想要做什么...... – twalberg

+0

@twalberg:Sry.I已经从基于UNIX的书中编写了这些代码,他们使用的信号是DEL.I没有得到,它的ctrl-c ot ctrl -z。但它的ctrl-c,因为如果你按ctrl-z abc()没有执行我的输出将是,aftr按ctrl-c它会显示第二个printf()而不是终止进程。该理论说,如果你按ctrl-c的时间,它会终止。但在我的情况下,只要按下ctrl-c,scnd printf()就会执行 – user2015915