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