+ Responder ao Tópico



  1. #1

    Padrão Servidor multithread em c++

    Pessoal to com um problema sério!

    Estou tentando criar um servidor que aceite múltiplas conexões!
    Estou utilizando threads, mas estou enfrentando alguns problemas pois nunca havia programado threads em linux!!!

    Li também algo sobre a função fork() mas não entendi como ela funciona. Até peguei um exemplo mas continuo sem entender... alguem pode me dar uma forca?! ai em baixo tem os trechos do código que eu não entendi... quanto a parte de sockets eu to acostumando mas depois de sigaction eu fiquei perdido...

    Qual seria a diferença entre fork() e thread?? No meu caso o que seria melhor usar?

    Código :
     
    void sigchld_handler(int s)
    {
        while(wait(NULL) > 0);
    }
     
    (...)
     
    int main (){
     
        (...)
     
        if (listen(sockfd, 10 ) == -1) {
            perror("listen");
            exit(1);
        }
     
        struct sigaction sa;
        sa.sa_handler = sigchld_handler; // retira todos os processos ociosos
        sigemptyset(&sa.sa_mask);
        sa.sa_flags = SA_RESTART;
        if (sigaction(SIGCHLD, &sa, NULL) == -1) {
            perror("sigaction");
            exit(1);
        }
     
        while(1) { // loop principal accept()
            sin_size = sizeof(struct sockaddr_in);
            if ((nova_fd = accept(sockfd, (struct sockaddr*)&outro_end,&sin_size)) == -1) 
            {
                perror("accept");
                continue;
            }
            printf("servidor: recebeu conexão de%s\n",inet_ntoa(outro_end.sin_addr));
            if (!fork()) { // este é o processo-filho
                close(sockfd); // o filho não precisa de escutar conexões
                if (send(nova_fd, "Olá , Beleza!\n", 14,0) == -1)
                    perror("send");
                close(nova_fd);
                exit(0);
            }
            close(nova_fd); // o processo principal não precisa disso
        }
        return 0;
    }


    caso queiram ver o codigo completo
    http://olinux.uol.com.br/artigos/395/print_preview.html


    Valeu...

  2. #2
    andre_udi
    Visitante

    Padrão Threads - Fork

    Ao criar uma thread, vc cria uma outra linha de execucao no seu programa, isso inclui areas para texto, seg de dados e pilha.
    Já o fork é utilizado para criacao de processos, + precisamente ele cria uma imagem( processo filho ) do processo q o chamou( processo pai ).
    A funcao fork retorna 0 para o processo filho e o pid o processo filho para o pai( -1 se erro ). Por isso o if( !fork ) no codigo, para saber se esta executando o processo pai ou filho.

    ate

  3. #3

    Padrão

    Agradeço a ajuda mas e quanto a estrutura sigaction e a função sigchld_handler??? Esta última sempre dá problema quando tento compilar...alguem sabe o que é?! Já a estrutura, para que ela serve??