PDA

View Full Version : [C] select() e ricezione di SIGTERM


Manugal
14-04-2010, 17:58
Ciao a tutti!

Ho un ciclo strutturato in questo modo:


...
while(!shutDown){
FD_SET(POP3Socket,&rfds);
FD_SET(SMTPSocket,&rfds);
timeout.tv_sec = 3;
timeout.tv_usec = 0;
selRet=select(nfds,&rfds,NULL,NULL,&timeout);
if (selRet < 0 && errno != EINTR){
PrintError("select() error: ");
}
else if(selRet < 0)
continue;
else if(selRet==0){
FD_SET(POP3Socket,&rfds);
FD_SET(SMTPSocket,&rfds);
timeout.tv_sec = 3;
timeout.tv_usec = 0;
}
else if(FD_ISSET(POP3Socket,&rfds)){
POP3Conn(&pArgs[idx[0]]);
}
else if(FD_ISSET(SMTPSocket,&rfds)){
SMTPConn(&pArgs[idx[1]]);
}
}
LinuxMPShutDown(pArgs);
...


Il problema sorge quando gli invio il segnale SIGTERM (lo uso per chiudere l'applicazione). Se è ancora in corso la select(), come da documentazione, si interrompe, chiama il signal handler e poi riprende. Il fatto è che lui esegue la LinuxMPShutDown (che chiude i socket) che si trova fuori dal ciclo, ma poi comunque riprende la select() e ovviamente va in errore perché i socket sono stati chiusi. Come posso ovviare a questo problema? Non c'è proprio il modo di evitare che select() riparta?

Manugal
14-04-2010, 18:00
Scusate ho sbagliato sezione, potete spostarlo in Programmazione? Grazie. :)