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)では、sleep と alarm を混在させるのは安全ではないと明確に書かれています。

3 番目に、メイン関数で十分に待機しないため、2 番目のアラーム ハンドラが実行される前に終了できます。

これを行う方法は次のとおりです。

#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 に答える