親愛なる、
子プロセスを実行し、ソケット経由でこの子プロセスに接続しようとするメイン プログラムがあります。この接続は正常に機能します。しかし、エラーが検出されると、メイン プログラムはソケット接続を適切に閉じようとし、子プロセスを強制終了し、新しいプロセスを再起動して、新しい子プロセスに接続しようとします。
再接続は数百回実行できます。しかし、これを何百回も繰り返すと、一定回数のサイクルの後、メイン プログラムは子プロセスに接続できなくなります。
これにリンクがあるかどうかはわかりませんが、ソケットを適切に閉じようとすると、メインプログラムが SIGPIPE を受け取ることがあります。無視して処理を続行します。しかし、プログラムが接続を受け入れなくなると、常に 10 個の SIGPIPES を受信していることに気付きました。何度か試しましたが、いつも10で終わります。
何か案が ?
よろしく、ブライス
編集済み:
接続を閉じるコードは次のとおりです。
int BAE_nb_sigpipes_received = 0;
void enmx_close( ENMX_HANDLE conn )
{
sConnectionInfo **connInfo, *temp;
SOCKET_CMD_HEAD cmd_head;
time_t secs;
pth_event_t ev_wakeup;
temp = NULL;
for( connInfo = &enmx_connections; *connInfo != NULL; connInfo = &(*connInfo)->next ) {
if( (*connInfo)->socket == conn ) {
temp = *connInfo;
*connInfo = (*connInfo)->next;
break;
}
}
if( temp != NULL ) {
cmd_head.cmd = SOCKET_CMD_EXIT;
cmd_head.address = 0xffff;
secs = time( NULL ) + TIMEOUT;
switch( temp->mode ) {
case ENMX_MODE_STANDARD:
while( write( conn, &cmd_head, sizeof( cmd_head )) == -1 )
{
if( errno == EAGAIN ) {
if( secs <= time( NULL )) {
break;
}
usleep( 10 * 1000 );
continue;
}
/* BAE : if we encounter a sigpipe, the client stupidly continues to try to write to scoket, which never ends...*/
else if (errno == EPIPE)
{
BAE_nb_sigpipes_received++;
break;
}
}
break;
case ENMX_MODE_PTH:
ev_wakeup = pth_event( PTH_EVENT_TIME, pth_time( secs, 0 ));
pth_write_ev( conn, &cmd_head, sizeof( cmd_head ), ev_wakeup );
// either the request has been sent or timeout reached
// in any case, we've finished
pth_event_free( ev_wakeup, PTH_FREE_ALL );
break;
}
if( temp->hostname ) free( temp->hostname );
if( temp->name ) free( temp->name );
free( temp );
}
close( conn );
}
`
それを開くコードは次のとおりです。
if( connect( sock_con, (struct sockaddr *)&server, sizeof( struct sockaddr_in )) != 0 ) {
printf("ENMX_E_SERVER_NOTRUNNING (%s)\n", myname);
return( ENMX_E_SERVER_NOTRUNNING );
}
`
子プロセスを強制終了するコードは次のとおりです。
wxProcess::Kill(eibnetmux_process_pid, wxSIGKILL);
`