2

SIGUSR1 シグナルを処理したいので、必要なことをすべて実行し、機能します。しかし、私のプログラムでは recvfrom で待機しており、シグナルを処理してから recvfrom に戻ると、この関数から -1 が返されます。この関数で待機に戻ることはできますか?

4

2 に答える 2

4

システムコールがシグナルによって中断されています。sigactionフラグを使用して一貫してシグナル ハンドラーを設定している場合をSA_RESTART除き、次のようなループを使用してシステム コールを再試行することをお勧めします。

while ((size = recvfrom(...)) == -1 && errno == EINTR)
  ;
于 2012-11-18T08:38:50.233 に答える
2

戻っ-1て設定errnoするEINTR必要があります。もう一度呼び出すか、シグナルによって中断されたときに再起動SA_RESTARTできるようにするシグナルハンドラーを設定するときにフラグを使用する必要があります。recvfrom

man signal(7) ページから:

次のインターフェイスのいずれかへのブロックされた呼び出しがシグナル ハンドラーによって中断された場合、SA_RESTART フラグが使用されていれば、シグナル ハンドラーが戻った後に呼び出しが自動的に再開されます。そうしないと、呼び出しはエラー EINTR で失敗します。

ソケットインターフェース: タイムアウトが設定されていない限り、accept(2)、connect(2)、recv(2)、recvfrom(2)、recvmsg(2)、send(2)、sendto(2)、および sendmsg(2)ソケット上 (下記参照)

于 2012-11-18T08:36:39.490 に答える