Та же программа работает хорошо, когда я строю ее в одиночку.но при вызове из многопоточного кода это не работает.
ОБНОВЛЕНИЕ: Я пытаюсь вызвать этот код из функции * mixmonitor_thread (void * obj) , расположенной внутри Mix-monitor модуля Сервер Asterisk (УАТС на базе IP).
Программа зависла при FD_ZERO () при программировании сокетов в C. Я работаю в Среда CentOS 6.5 .
Если я удаляю FD_ZERO (), тогда все работает, но выбор функций, возвращающих непредсказуемый результат, может быть из-за отсутствия инициализации файловых дескрипторов с FD_ZERO ()
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <fcntl.h>
#include <strings.h>
void my_function()
{
int flags = 0, error = 0, ret = 0;
fd_set rset, wset;
socklen_t len = sizeof(error);
struct timeval ts;
ts.tv_sec = timeout;
//clear out descriptor sets for select
//add socket to the descriptor sets
FD_ZERO(&rset);// ------------- HERE I AM GETTING THAT ISSUE --------------
FD_SET(sock, &rset);
wset = rset; //structure assignment ok
//set socket nonblocking flag
if( (flags = fcntl(sock, F_GETFL, 0)) < 0)
return -1;
if(fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0)
return -1;
//initiate non-blocking connect
if( (ret = connect(sock, (struct sockaddr*) &server_address, sizeof (server_address)) < 0)
if (errno != EINPROGRESS)
return -1;
if(ret == 0) //then connect succeeded right away
goto done;
//we are waiting for connect to complete now
if( (ret = select(sock + 1, &rset, &wset, NULL, (timeout) ? &ts : NULL)) < 0)
return -1;
if(ret == 0){ //we had a timeout
errno = ETIMEDOUT;
return -1;
}
//we had a positivite return so a descriptor is ready
if (FD_ISSET(sock, &rset) || FD_ISSET(sock, &wset)){
if(getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
return -1;
}else
return -1;
if(error){ //check if we had a socket error
errno = error;
return -1;
}
}
При выполнении вышеуказанного программного кода он останавливается на FD_ZERO () и показывает ошибку сегментации.Как мне это исправить?