2013-07-14 26 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

恐怕还是什么都没有发生 –