Segmentation fault
От: alexora  
Дата: 01.06.04 22:00
Оценка:
Я вот написал софтину, которая чекает мыла на валидатность. Она у меня тредовая. Кол. тредов указываешь. Каждый тред считывает определенное кол. бай с файла и чекает мыла на MX записи. Чекаю я через
res_search
функцию. Тестирование я проводил при 500 тредах, каждый тред считывал по 10кб данных с файла. Прикол в том, что если закоментировать кусок кода, который чекает на MX записи, то все пашет (файл при єтом парсится тредами и переписывается в другой). Если оставить этот кусок кода, то на середине проверки вываливается Segmention fault Как это понять ?

Вот весь код :


#include <sys/types.h>
#include <stdio.h>
#include <pthread.h>
#include <g++/vector>
#include <g++/string>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
#include <g++/iostream>
#include <sys/stat.h>
#include <unistd.h>
#include <g++/algorithm>


#define MAXTHREADCOUNT 500
#define MINTHREADCOUNT 1
#define STEPPOS           10240


void    readData(char*, long, int);
void    usage();
int     emailParse(char* email, string& account);
void*   thread_proc(void*);
long    getFileSize(char*);


struct threaddata
{
    long pos;
    int  id;
};

string  account = "                                      ";
long    threadcount = 0;
char    s_filein[128];
char    s_filebad[128];
char    s_filegood[128];
long    itemindex;
long    filesize = 0;
long    filepos  = 0;
pthread_t threads[MAXTHREADCOUNT];

threaddata MID[MAXTHREADCOUNT];
vector<string>  V[MAXTHREADCOUNT];
int        Free[MAXTHREADCOUNT];
vector<string>  whitelist;
vector<string>  badlist;

int main(int argc, char** argv)
{
    for (int index=1;index<argc;index++)
    {
            if (!strcmp("-threadcount",  argv[index])) threadcount = atoi(argv[index+1]); else
            if (!strcmp("-bad",          argv[index])) strcpy(s_filebad, argv[index+1]); else
            if (!strcmp("-in",           argv[index])) strcpy(s_filein,  argv[index+1]); else
            if (!strcmp("-good",         argv[index])) strcpy(s_filegood,argv[index+1]); 
    }

    if ((!threadcount) || (!strlen(s_filebad)) || (!strlen(s_filegood)) || (!strlen(s_filegood)))
    {
        usage();
        return 1;
    }

    if (!((threadcount<=MAXTHREADCOUNT) && (threadcount>=MINTHREADCOUNT))) 
    {
        usage();
        return 1;
    }

    filesize = getFileSize(s_filein);


    for (itemindex=0;itemindex<threadcount;itemindex++) Free[itemindex] = 1;    

    while (filepos<filesize)
    {
        for (itemindex=0;itemindex<threadcount;itemindex++)
        {
            if (Free[itemindex])
            {
                MID[itemindex].id  = itemindex;
                MID[itemindex].pos = filepos;
                pthread_create(&threads[itemindex], NULL, &thread_proc, &MID[itemindex]);
                filepos+=STEPPOS;
            }
        }
        sleep(1);
    }

        for (itemindex=0;itemindex<threadcount;itemindex++) pthread_join(threads[itemindex], NULL);

    return 0;
}

void usage()
{
    printf("Usage : \n");
    printf("$./a.out -in mails.txt -good good.txt -bad bad.txt -threadcount 50\n");
    printf("Note, please %i<=threadcount<=%i\n",MINTHREADCOUNT, MAXTHREADCOUNT);
}

void readData(char* filename, long p, int id)
{
    long    size = 0;
    char    ch = 0;
    char    line[100];
    FILE*   f = fopen(filename,"r");
    fseek(f, p, 0);
    if (p) while ((ch!='\n') && (!feof(f))) fscanf(f,"%c",&ch);

    V[id].clear();

    while ( (!feof(f)) && (size<(STEPPOS+60)))
    {
        fscanf(f,"%s",line);
        size+=(strlen(line) + 2);
        if (size>(STEPPOS+60)) break;
        if (emailParse(line, account))
        {
            if (account.length())
            {
                V[id].push_back(account);
            }
        }
    }
}

int emailParse(char* email, string& account)
{
    int index = 0;
    while (index<strlen(email))     account[index] = email[index++];
    account[index] = 0;
    return 1;
}

void* thread_proc(void* parameter)
{
    struct threaddata*  data = (struct threaddata*)parameter; 

    Free[data->id] = 0;

    if (data->pos>filesize) 
    {
        Free[data->id] = 1;
        return NULL;
    }

    unsigned char answer[PACKETSZ]; 

    readData(s_filein, data->pos, data->id);

        vector<string>::iterator itvec = V[data->id].begin(), itvecEnd = V[data->id].end();
    int vsize = V[data->id].size();
        for (int index=0;index<vsize;index++)          
    {
           char* email = (char*)V[data->id][index].c_str();
           char  acc[32], dom[32];
           int  i = 0;
           int  p = 0;
           while ((email[i]!='@') && (i<strlen(email))) acc[i] = email[i++];
           acc[i] = 0;
           i+=1;
           while (i<strlen(email))    dom[p++] = email[i++];
             dom[p] = 0;

           int flag = 0;

           string sdom = dom;

             FILE* f=fopen("r.txt","a");
           fprintf(f,"%s@%s\n", acc, dom);
           fclose(f);

           


           if (res_search(dom, C_IN, T_MX, static_cast<u_char*>(answer), sizeof(answer))>0) flag = 1;
           if (!flag) if (res_search(dom, C_IN, T_MX, static_cast<u_char*>(answer), sizeof(answer))>0) flag = 1;
           if (flag)
            {
            FILE* f=fopen(s_filegood,"a");
            fprintf(f,"%s\n", email);
            fclose(f);
           } else
           {
            FILE* f=fopen(s_filebad,"a");
            fprintf(f,"%s\n", email);
            fclose(f);
           }


        }

    Free[data->id] = 1;

    return NULL;
}


long getFileSize(char* filename)
{
    struct stat st;
    FILE* f = fopen(filename,"r");
    fstat(fileno(f), &st);
    fclose(f);
    return st.st_size;
}


А вот этот кусок кода у меня чекает на MX записи. Если его закоментировать то все Ок, иначе сегм. фаулт :



if (res_search(dom, C_IN, T_MX, static_cast<u_char*>(answer), sizeof(answer))>0) flag = 1;
           if (!flag) if (res_search(dom, C_IN, T_MX, static_cast<u_char*>(answer), sizeof(answer))>0) flag = 1;
           if (flag)
            {
            FILE* f=fopen(s_filegood,"a");
            fprintf(f,"%s\n", email);
            fclose(f);
           } else
           {
            FILE* f=fopen(s_filebad,"a");
            fprintf(f,"%s\n", email);
            fclose(f);
           }



С памятью я вроде нормально работаю, ну и с тредами верно обращаюсь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.