4

現在、シグナル (この場合は SIGINT) を使用して、accept() および/または write() の待機から抜け出そうとしています。私のプログラムは期待どおりに終了しません。

void sigHandler(int signal ){

    printf(" Exit\n");

    //x is global
    x = 1;

    return;

}

私がハングアップしているメインから切り取ったものは主に次のとおりです。

 clientfd = accept( sockfd, (struct sockaddr *) &client_addr, (unsigned int *) &client_addr_len );

これをヒットしてシグナルを使用して戻ると、まだこのコード行でスタックしており、ユーザーがソケットに接続するのを待っています。ハンドラーの x は、このコードが含まれる外側のループを表します。

私がやろうとしていることを行うためのより良い方法はありますか? また、これが十分な情報でない場合はお知らせください。

ありがとうございました。

編集:

メインの一番上に戻ってきたシグナルのチェックです。これがあなたが求めていたものだと思います:

if ( signal( SIGINT, signalhandler ) == SIG_ERR ){
    return( 1 );
}
4

1 に答える 1

9

を使用してシグナル ハンドラを確立するsignalと、acceptは自動的に再起動します。の使用は、set to includeでsignalの使用に似ています。の代わりにを使用し、struct sigaction のフィールドにビットが設定されていないことを確認してください。sigactionsa_flagsSA_RESTARTsignalsigactionsa_flagsSA_RESTART

つまり、: の代わりに、次signal( SIGINT, signalhandler )を使用します。

struct sigaction a;
a.sa_handler = signalhandler;
a.sa_flags = 0;
sigemptyset( &a.sa_mask );
sigaction( SIGINT, &a, NULL );
于 2013-03-08T20:29:35.323 に答える