Pthread qui segfault

Signaler
Messages postés
2
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
2 mai 2007
-
Messages postés
149
Date d'inscription
mercredi 28 mars 2007
Statut
Membre
Dernière intervention
17 mai 2007
-
Voila un morceau de code :

void *test(void *meuh)
{
}

bool CNetwork::initSocket()
{
        if ((_uSocket (unsigned int)socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) INVALID_SOCKET)
                return (false);
        printf("socket is created\n");
        int reuse = 1;
        setsockopt(_uSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse));
        pthread_t zou = 2;

         printf("il va y avoir un segfault!\n");
        pthread_create(&zou, NULL, test,NULL);
        printf("ou pas :p\n");

        return true;
}

Donc voila, ca compile bien sous linux, mais a l'exec, ca pete un segfault sur le pthread_create...
Si vous avez une idee (ou plus :p) sur la raison de ce segfault, ca m'arrangerais beaucoup :p

Merci d'avance! ^^

1 réponse

Messages postés
149
Date d'inscription
mercredi 28 mars 2007
Statut
Membre
Dernière intervention
17 mai 2007
1
Salut, 

Donc, le premier parametre de socket devrait etre PF_INET semantiquement, mais l'erreur ne vient pas de là.
___ le man de pthread_create dit cela : If the start_routine returns, the effect is as if there was an implicit call to pthread_exit() using the return value of start_routine as the exit status.___

-MAIS vu que ta fonction "test" ne fait pas un return NULL, elle va renvoyer une valeur etrange qui pourrait peut-etre faire seg-faulter pthread_exit.
-Y'a aussi le probleme de ta variable zou que tu devrais allouer dynamiquement pour eviter les problemes.
-je te conseille en gros de faire un programme qui ne contient rien que l'appel a ton pthread_create, pas de sockets ni rien d'autre, et de faire les choses proprement en faisant retourner NULL à ta fonction test.
-Et de compiler avec -Wall pour voir les warnings (notamment que test ne retourne rien)
Ca aidera je pense:p
@++

Si ca se trouve c'est ton return NULL qui manque seulement, du coup ca renvoie return RANDOM-VALUE
( qui a de grandes chances de pointer en memoire là ou faut pas )