Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [C] thread linux

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813

    [C] thread linux

    ciao a tutti,
    seguo il corso di sistemi distribuiti nella mia università e non riesco a creare un thread linux. Ma a me il codice pare a prova di imbecille (ovvero me), ma intanto non va!

    Posto tutti il codice
    codice:
    struct InetClient
    {
    	int socket;
    	struct sockaddr_in address;
    	int addressLength;
    };
    
    void ClientLister (void * );
    
    
    int main(int argc, char** argv)
    {
    	int serverSocket,clientAddrLength;
    	struct sockaddr_in qualsiasi, clientAddr;
    	
    	qualsiasi.sin_family = AF_INET;
    	qualsiasi.sin_port   = htons(4000);
    	qualsiasi.sin_addr.s_addr = INADDR_ANY;
    	
    	serverSocket = socket(PF_INET, SOCK_STREAM, 0);	
    	bind(serverSocket, (struct sockaddr *)&qualsiasi, sizeof ( qualsiasi));
    	listen(serverSocket,0);
    	
    	while (1)
    	{
    		clientAddrLength = sizeof(struct sockaddr_in);
    		printf("Waiting for client...\n");
    		int clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &clientAddrLength);
    		printf("Client connected\n");
    	
    		struct InetClient * client = (struct InetClient*) malloc(sizeof(struct InetClient*));
    		client->socket  = clientSocket;
    		client->address = clientAddr;
    		client->addressLength = clientAddrLength;
    		
    		pthread_t *nuovoThread = (pthread_t*)malloc(sizeof(pthread_t));
    		
    		pthread_create(nuovoThread,NULL,(void*)&ClientLister,(void*)&client);
    	}
    	
    	return 0;
    }
    
    void ClientLister(void * arg)
    {
    	struct InetClient client = *((struct InetClient *) arg);
    	printf("Eccomi qua");
    }
    con telnel riesco a connettermi su questo server. Essendo sistemi distribuiti, sto coniugando socket C e thread linux in un sol colpo....
    l'output aspettato da questo programma è qualcosa tipo:

    Waiting for a client...
    Client connected
    Waiting for a client...
    Eccomi qua


    ma niente...sembra che il thread non parta, anzi non parte proprio...
    Ho provato a fare una join, ma non parte ugualmente e la join non esulerebbe dal mio scopo...
    cosa sbaglio?

    Socket problemi non ne danno e la creazione dei thread non prende più di 2 righe di codice, ma intanto non va...

    suggerimenti?
    vi ringrazio anticipatamente
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    nessuno sa aiutarmi?
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  3. #3

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    E pure sbagliato.
    codice:
    ...
    struct InetClient * client = (struct InetClient*) malloc(sizeof(struct InetClient*));
    ...
    Dovrebbe essere:
    codice:
    ...
    struct InetClient * client = (struct InetClient*) malloc(sizeof(struct InetClient)); << senza *
    ...
    Poi
    codice:
    ...
    pthread_create(nuovoThread,NULL,(void*)&ClientLister,(void*)&client);
    ...
    Dovrebbe essere:
    codice:
    ...
    pthread_create(nuovoThread,NULL,ClientLister,client);
    ...
    Senza contare che non ti preoccupi troppo della gestione della memoria. Dove sono deallocate le strutture di cui fai la malloc?

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    a me compila...
    l'errore del malloc è corretto, ma non capisco dove ho sbagliato nel pthread create?
    pthread create prende una sfilza di puntatori (tra l'altro, a void)

    forse non vi compila xke nn ho postato gli header, che sono:

    #include <netinet/in.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <netdb.h>
    #include <pthread.h>
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    http://opengroup.org/onlinepubs/0079...ad_create.html

    pthread_create prende come terzo parametro un puntatore a funzione, mentre tu casti quel puntatore a void* il che è sbagliato. Il quarto parametro poi è già un puntatore e al massimo andrebbe scritto come (void*) client, mentre tu passi qualcosa come:

    struct InetClient** tmp = &client;
    (void*) tmp;

    il che non ha molto senso.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    ti ringrazio shodan...
    ti posso dire che mettendo (void *)&ClientListener, o mettendo solo ClientListener, il thread parte comunque, solo che come mi ha suggerito tu ricevo un warning...
    Effettivamente client è già un puntatore, ed era visibilmente sbagliato quel che facevo, infatti ora riesco a ricevere i dati dalla socket...
    ti ringrazio per le dritte....
    una domanda: ClientListener, o qualsiasi altro identificatore di funzione, è un puntatore già così?
    Nelle slide del mio prof, lui suggerisce (void*)&Funzione...
    cosa c'è di sbagliato?
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Una funzione di per se è già un puntatore (il cui tipo dipende dal tipo di ritorno e dai parametri che prende.)
    La forma corretta (e rindondante) sarebbe (nel tuo caso) &ClientListener, mentre ClientListener è una forma abbreviata. E' quel (void*) che può creare problemi in quanto altera il tipo corretto di puntatore a funzione, in un puntatore a "tutto".
    Nel caso della pthread_create probabilmente quell'argomento viene ricastato al tipo originale, ma fare queste assunzioni è pericoloso in quanto le singole implementazoni possono differire.
    In generale è sempre meglio evitare i cast rindondandi, lasciando eventualmente che sia il compilatore a protestare. Metterne uno di troppo, rischia di far impazzire il programmatore.

  9. #9
    $ man pthread_create:
    int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
    void *(*start_routine)(void *), void *arg);
    insomma la tua ClientLister e':

    codice:
    void ClientLister (void * );
    ma dovrebbe essere:
    codice:
    void * ClientLister (void * );

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.