2013-07-14 45 views
2
#include <iostream> 
#include <unistd.h> 
#include <stdio.h> 
#include <signal.h> 
using namespace std; 

int count = 0; 

void alarm2(int signo) 
{ 
    cout << count; 
} 

void alarm1(int signo) 
{ 
    signal(SIGALRM, alarm2); 
    cout << "ctrl+C"; 
    alarm(10); 
    sleep(10); 
} 

int main() 
{ 
    signal(SIGALRM, alarm1); 

    alarm(3); 
    sleep(5); 
} 

我希望3秒後我得到消息「ctrl + C」,然後另一個鬧鐘設置爲10秒;之後我應該得到count的價值。但是當我在10秒後運行時,我得到了「ctrl + C」和值count在Unix中結束兩個報警信號並計數SIGINT

+0

使用暫停(),不標記C#,不要在信號處理程序使用COUT。 –

+0

爲什麼我不應該使用cout並且在哪裏使用暫停() –

+0

您在'cout'調用之後沒有發送換行符,並且您沒有明確地刷新輸出結果......您之後只能看到輸出,因爲您的程序終止導致緩衝區刷新。此外,你的第一個信號處理程序中的睡眠是一件可怕的事情;擺脫它! (也許把它移到主)。 – mah

回答

1

在你的例子中,你犯了許多錯誤。

首先看文檔中關於其功能是安全地從 信號處理器調用: https://www.securecoding.cert.org/confluence/display/seccode/SIG30-C.+Call+only+asynchronous-safe+functions+within+signal+handlers

可分配內存當然功能中是不安全的調用,因爲它是不安全的調用malloc 。 由於在信號處理程序中調用printf或std :: ostream :: opeartor < <(std :: cout < <)是不正確的。

其次,在文檔(型男子3睡眠)寫清楚它是不是安全的混合睡眠和報警

三,你不是在主函數等待足夠的,所以它可以第二警報處理程序運行前退出。

這裏是它是如何做:

#include <unistd.h> 
#include <stdio.h> 
#include <signal.h> 

volatile sig_atomic_t done = 0; 

void alarm2(int signo) 
{ 
    write(STDOUT_FILENO, "alarm2\n", sizeof("alarm2\n") - 1); 
    done = 1; 
} 

void alarm1(int signo) 
{ 
    signal(SIGALRM, alarm2); 
    write(STDOUT_FILENO, "ctrl+C\n", sizeof("ctrl+C\n") - 1); 
    alarm(10); 
} 

int main() 
{ 
    signal(SIGALRM, alarm1); 

    alarm(3); 

    while (done == 0) 
    sleep(1); //sleep can be wake up by alarm signal, so check flag  
} 
+0

非常感謝你,我已經完成了我的工作,加入了你的預防措施。 –

+1

@UsmanNazir請點擊此答案旁邊的複選標記並向上投票。它有很多幫助。 – 0x499602D2

+0

確定我會投票它,因爲我不能投票,因爲newer.it不允許我這樣做 –

0

Add「< < endl;」到你所有的cout陳述並再試一次。

+0

恐怕還是什麼都沒有發生 –