背景:これは、 C ++(Linux / GCC)でのシステムコールのEINTRの処理に関するこのスレッドのフォローアップ質問です。アプリケーションのプロファイルを作成するかどうかに関係なく、システムコールの設定errno
をEINTR
特別な場合として処理する必要があるようです。の使用については、多くの、多くの、多くのgoto
意見があります。
私の質問:システムコールは、名目上のものと見なされる場合に設定errno
されていますか?そうでない場合は、次のコードを処理するように変換することをどのように提案しますか?EINTR
goto
EINTR
if ( ( sock_fd = ::socket( domain, type, protocol ) ) < 0 ) {
throw SocketException( "Socket::Socket() -> ::socket()", errno );
}
前もって感謝します!
乾杯、-
クリス
更新:以下の回答に基づいて、私は次のマクロを作成することになりました。
#define SOCK_SYSCALL_TRY(call,error) \
while ( (call) < 0 ) { \
switch ( errno ) { \
case EINTR: \
continue; \
default: \
throw SocketException( (error), errno ); \
} \
} \
これは、元のスニペットを次の例に変換するために使用されます。
SOCK_SYSCALL_TRY( sock_fd = ::socket( domain, type, protocol ), "Socket::Socket() -> ::socket()" )
これが他の誰かに役立つことを願っています!