Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: [C] Pipe

  1. #1

    [C] Pipe

    Ciao a tutti,
    avevo già iniziato un post su un errore, che ormai è risolto, ma voglio chiedervi se mi sapreste aiutare a far funzionare il pipe con per esempio 100 o 40 threads.
    Quello che voglio fare è inviare al thread 67 dal thread 23 dei dati da far inviare via socket al 67.

    Qui vengono generati threads:
    Codice PHP:
    while (1) {
            
    unsigned int clientlen sizeof(echoclient);
            
    /* Wait for client connection */
            
    if ((clientsock accept(serversock, (struct sockaddr *) &echoclient, &clientlen)) < 0) {
                Die(
    "Failed to accept client connection");
            }
            
    fprintf(stdout"Client connected: %s\n",
            
    inet_ntoa(echoclient.sin_addr));
            
    countrun++;
            
    pid_t pid fork();
            if(!
    pid){
                
    HandleClient(clientsockpiped);
                
    fprintf(stdout"Client Disconnected: %s\n"inet_ntoa(echoclient.sin_addr));
            }
        } 
    Qui sta l'azione che viene eseguita per ogni thread:
    Codice PHP:
    void HandleClient(int sockint piped) {
        
    char buffer[BUFFSIZE];
        
    int received = -1;
        if ((
    received recv(sockbufferBUFFSIZE0)) < 0) {
            Die(
    "Failed to receive initial bytes from client");
        }

        while (
    received 0) {
            if (
    send(sockbufferreceived0) != received) {
                Die(
    "Failed to send bytes to client");
            }
            if ((
    received recv(sockbufferBUFFSIZE0)) < 0) {
                Die(
    "Failed to receive additional bytes from client");
            }
        }
        
    close(sock);


  2. #2

  3. #3
    Vabbe.. però volevo essere aiutato :S

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Originariamente inviato da Sevenarth
    Vabbe.. però volevo essere aiutato :S
    Si pero devi essere più chiaro: una pipe è una cosa, un thread un' altra e la creazione di processi per mezzo della fork() un' altra ancora..
    ma voglio chiedervi se mi sapreste aiutare a far funzionare il pipe con per esempio 100 o 40 threads.
    La pipe mi sembra che sia un metodo di comunicazione tra 2 processi.
    Se poi vuoi creare N processi o threads lo puoi sempre fare implementando
    codice:
    pid_t procs[N];
    /* o */
    pthread_t threds[N];
    da gestire con una funzione a parte o come preferisci, puoi usare un ciclo for o un while, ma sconsigliatissimo un while(1).

  5. #5
    ok grazie e in caso per accedere al thread da un altro?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Originariamente inviato da Sevenarth
    ok grazie e in caso per accedere al thread da un altro?
    Devi creare una o più funzioni a parte ciascuna gestita da ciuascun thread e per "creare" ciuscun thread devi usare la pthread_create e gestirli con le altre varie funzioni della API Posix sui threads.
    Qui trovi informazione più dettagliata a riguardo.

  7. #7
    Potresti farmi un esempio su come trasferire dati da thread a thread? Grazie

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Originariamente inviato da Sevenarth
    Potresti farmi un esempio su come trasferire dati da thread a thread?
    In una applicazione che usa i socket, un thread eseguirebbe una funzione di scrittura in un socket e l'altro thread eseguirebbe una funzione di lettura dal socket..
    Ti posto un esempio di uso dei pthread che ho ripescato dall' HD portatile , ma scriverti un programma multithread d'esempio che usa i socket, ora come ora non he ho il tempo.
    codice:
    #include<stdio.h>
    #include<unistd.h>
    #include<pthread.h>
    
    #define MAX_THREADS 5
    
    void mod_var(int *a)
    {
       *a += 5;
     
       pthread_exit(0);
    }
    
    void start(pthread_t threads[], int *a)
    {
       int i;
       pthread_attr_t attr;
     
       for(i = 0; i < MAX_THREADS; i++)
       {
          threads[i] = pthread_attr_init(&attr);
      		
          if((pthread_create(&threads[i], &attr, (void *)mod_var, (void *)a)) == 0)
             printf("Thread %d executed: a = %d\n", i, *a);
      		
          pthread_join(threads[i], 0);
       }
    }
    
    int main(void)
    {
       int a = 0;
       pthread_t threads[MAX_THREADS];
    
       printf("\n(in main) a = %d\n\n", a); 
       start(threads, &a);
       printf("\n(in main) a = %d\n\n", a);
     
       return 0;
    }
    Spero che possa aiutarti a capire.
    Se hai bisogno di consigli su documentazioni e libri chiedi pure

  9. #9
    Sì grazie, questo lo avevo capito
    Volevo solo sapere come far inviare i dati.. da thread a thread... un esempio banale come vengono creati 2 thread. quando viene creato il secondo lui invia al primo dei dati che sono da stampare con printf()

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Originariamente inviato da Sevenarth
    Sì grazie, questo lo avevo capito
    Volevo solo sapere come far inviare i dati.. da thread a thread... un esempio banale come vengono creati 2 thread. quando viene creato il secondo lui invia al primo dei dati che sono da stampare con printf()
    Volevo già dirtelo prima...
    I thread sono una cosa, i socket sono un'altra, e tra i 2 c'è una grande differenza. Questo vuol dire che non puoi trasferire dati da un thread all'altro come se fossero 2 socket.. Il thread è una suddivisione di un processo.
    Un thread esegue una funzione ed un altro ne esegue un' altra, e se le due funzioni lavorano sulla stessa variabile che magari viene copiata in un'altra, in fin dei conti, non è che c'è un trasferimento di dati fra i due threads..
    codice:
    funzione1(var);
    funzione2(var);
    
    processo()
    {
       var;
       thread1 - > funzione1(var);
       thread2 - > funzione2(var);
    }
    In una applicazione di rete
    codice:
    server()
    {
       thread1 -> riceve richieste di connessione;
       thread2 -> invia dati tramite il socket;
    }
    
    client()
    {
       thread1 -> invia richiesta di connessione;
       thread2 -> riceve dati tramite socket;
    }
    Ti stai confondendo con le pipe..
    PS: IPC

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 © 2025 vBulletin Solutions, Inc. All rights reserved.