Документация говорит, что accept() должен прерваться после выполнения обработчика сигнала и вернуть -1. По какой причине accept() может не прерываться сигналом?
if (!_tcp_inited){
int bind_res, listen_res;
_sock = socket(AF_INET, SOCK_STREAM, 0);
if (_sock < 0) return SYSTEM_ERR;
struct sockaddr_in addr;//, client_addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = _client->GetTCPPort();
addr.sin_addr.s_addr = INADDR_ANY;
bind_res = bind(_sock, (sockaddr*)&addr, sizeof(addr));
if (bind_res != 0) return SYSTEM_ERR;
listen_res = listen(_sock, 2);
if (listen_res != 0) return SYSTEM_ERR;
_tcp_inited = true;
}
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
printf("accept start\n");
_fd = accept(_sock, (sockaddr*)&client_addr, &client_addr_len);
printf("accept finish\n");
//printf("accept ends\n");
if (_fd < 0) return SYSTEM_ERR;
return OK;
Подписка на событие:
void BCPDaemon::IntrHandler(int signum){
_sig_stop = 1;
}
//TODO:write into log
int BCPDaemon::Init(){
bsd_signal(SIGTSTP, SIG_IGN);
bsd_signal(SIGINT, BCPDaemon::IntrHandler);
...
}
Система - Slackware 12.