2013-02-04 59 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