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.

4

2 回答 2

1

在您的示例中,您犯了很多很多错误。

首先查看关于从信号处理程序调用哪个函数是安全的文档: https ://www.securecoding.cert.org/confluence/display/seccode/SIG30-C.+Call+only+asynchronous-safe+functions+内+信号+处理程序

当然,可以分配内存的函数调用起来是不安全的,因为调用 malloc 是不安全的。因为在信号处理程序中调用 printf 或 std::ostream::opeartor<< (std::cout <<) 是不正确的。

其次,在文档(type man 3 sleep)中明确写明混合睡眠和警报是不安全的

第三,您在主函数中等待的时间不够长,因此它可以在第二个警报处理程序运行之前退出。

这是如何完成的:

#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    
}
于 2013-07-14T15:50:37.843 回答
0

添加“<< endl;” 你所有的 cout 声明,然后再试一次。

于 2013-07-14T12:39:25.170 回答