Ошибка сегментации на FD_ZERO () при программировании сокета с C с использованием многопоточности - PullRequest
0 голосов
/ 04 октября 2018

Та же программа работает хорошо, когда я строю ее в одиночку.но при вызове из многопоточного кода это не работает.

ОБНОВЛЕНИЕ: Я пытаюсь вызвать этот код из функции * 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 () и показывает ошибку сегментации.Как мне это исправить?

...