4

無限ループでは、新しい接続を受け入れていますが、そのサーバーを停止することを選択する必要があるため、ctrl + c(SIGINT)を使用します。これを押すと、シグナルハンドラが呼び出されますが、accept呼び出しは中断されないため、割り込みがtrueかどうかのチェックは評価されません(クライアントが接続していない場合、acceptは長時間ブロックされます)。

sig_atomic_t interrupt;
.
.
.
signal(SIGINT, sigintHandler);
.
.
.
while(!interrupt) {
  server.accept();
}
.
.
.
void sigintHandler(int param) {
    interrupt = 1;
}
4

1 に答える 1

7

を使用する場合、 OSはSA_RESTARTデフォルトでセマンティクスを使用していますsignal()。これは、マニュアルページで確認できるはずです。これを望まないので、を使用sigaction()してハンドラーを設定し、SA_RESTARTフラグを省略します。

于 2013-03-25T14:55:32.997 に答える