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

void sigint_handler(int);

int  main()
{
    signal(SIGINT, sigint_handler);

     while (1){
         pause();
     }
    printf("Out..\n");
    return 0;
}

 void sigint_handler(int sig)
{

    printf("killing process %d\n",getpid());
    exit(0);
}

私は得られません:出て... ctrl + cの後だから、出て行っている間、または出て行くことは決してありません。どうすれば修正できますか?メインで続行し、「Out ...」を印刷するにはどうすればよいですか?

4

4 に答える 4

3

私は得られません:アウト... ctrl+cの後

シグナルハンドラはすぐにプロセスを終了するためmain、実際にprintfを実行する機会はありません。exit私はあなたが実際にハンドラーに入れたくないのではないかと思います。pauseループから抜け出し、信号が配信されるまで待つ必要があります。

これは信号を待つ最良の方法ではありません。手始めに、あなたがチャンスを得る前に、ユーザーがSIGINTを送信する可能性があると考えられますpause。信号は失われpause(2)、時間の終わりまでブロックされます。

おそらく、sigsuspendまたはもっと単純なものを使用する必要がありsigpauseます。

于 2013-01-12T20:01:18.350 に答える
1

printfsigint_handlerでは 使用しないでください。未定義の動作である可能性があります。シグナルハンドラのマニュアルページで呼び出すことができる安全な関数のリスト
説明:より安全な信号処理のためにリエントラント関数を使用してください

于 2013-01-12T20:01:06.473 に答える
1
#include  <stdio.h>
#include  <signal.h>
#include <stdlib.h>
#include <unistd.h>

void sigint_handler(int);

int  main()
{
    signal(SIGINT, sigint_handler);


     pause();

    printf("Out..\n");
    return 0;
}

 void sigint_handler(int sig)
{

    printf("killing process %d\n",getpid());
    //exit(0);
}
于 2013-01-12T20:13:43.557 に答える
0

ループインを制御下で終了させたい場合はmain()、それを非無限ループにする必要があります。私はおそらくこれを行うでしょう:

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

static volatile sig_atomic_t sig_received = 0;
void sigint_handler(int);

int main(void)
{
    signal(SIGINT, sigint_handler);

    while (sig_received == 0)
        pause();
    printf("Out..\n");
    return 0;
}

void sigint_handler(int sig)
{
    sig_received = sig;
}

これは、POSIXよりもシグナルハンドラーで実行できることに関してはるかに厳しいC標準の要件を満たしています。

于 2013-01-12T20:19:04.967 に答える