Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [c] creazione processi in c

    ciao

    vorrei ascoltare contemporaneamente una comunicazione su 2 porte, per questo credo di aver bisogno di un hread separato, uno x la porta a uno x la porta b


    sapete dirmi come creare 2 thread in c?

    thnks

    (ho provato con fork() ma ho visto che non fa altro che creare 2 processi identici, questo non mi serve...io vorrei avere una funzione uguale da lanciare con 2 processi differenti)
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  2. #2
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    la fork crea due processi uguali padre-figlio con PID diverso.
    tu poi puoi usare il processo figlio per dargli da fare dell'altro. per esempio con codice del tipo

    id PID==qualcosa
    fai questo
    else
    fai quest'altro

    oppure puoi dare in pasto al processo figlio un programma/ da eseguire con la funzione exec (mi sembra di ricordare sia quella...)
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  3. #3
    TI AMO! VVoVe:


    skerz...
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  4. #4
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Infatti: devi gestire i processi come ti ha spigato Marco...
    Devi fare una cosa del tipo:
    codice:
    {
        pid_t pid;
        int fd_della_socket
        
        pid = fork ( );      // forki il processo
        if ( pid == 0 ) {
            // codice eseguito dal paadre
            // fd_della_socket = connettiti alla porta 1...
        } else {
            // codice eseguito dal figlio
            // fd_della_socket = connettiti alla porta 2...
        }
        // codice eseguito da entrambi
        // ...
    }


    Per maggiori info sulla fork: http://www.lilik.it/~mirko/gapil/gap...x81-510003.2.2







    Puoi usare anche metodi alternativi alla fork, puoi ad esempio utilizzare i pthreads oppure puoi usare un solo processo e ascoltare entrambe le porte grazie alla select o alla poll, ma questo metodo e' sconsigliato perche' nei nanosecondi in cui leggi una socket non puoi fare altro (nemmeno leggere l'altra)...


    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  5. #5
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    il mio era un tantino più pseudo-codice
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  6. #6
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Che voi sappiate esiste una funzione analoga alla fork su windows?

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  7. #7
    aaaaaaaaaaaarrrrrrrrrggggghhhhh VVoVe:

    ma che bestia nera è la fork()?

    cosa fa con la memoria?

    guardate questo pezzo di codice e ditemi (se potete):
    - se io sono pazzo
    - se il mio portatile è pazzo
    - perchè succede questo

    codice:
    using namespace std;
    
    #include<iostream>
    
    int main(){
      int pid1;
      int i=0;
      pid1=getpid();
      fork();
      
    
      while(1){
        sleep(1);
        
        if(pid1==getpid()){
          i++;
          cout<<"processo 1:"<<&i<<" = "<<i<<endl;
        }else{
          cout<<"processo 2:"<<&i<<" = "<<i<<endl;
        }
    
    }
    
      return 0;
    }

    output del programma:

    codice:
    nik600@criminal:~/rete$ ./a.out
    processo 2:0xbffff9a0 = 0
    processo 1:0xbffff9a0 = 1
    processo 2:0xbffff9a0 = 0
    processo 1:0xbffff9a0 = 2
    processo 2:0xbffff9a0 = 0
    processo 1:0xbffff9a0 = 3
    processo 2:0xbffff9a0 = 0
    processo 1:0xbffff9a0 = 4
    processo 2:0xbffff9a0 = 0
    processo 1:0xbffff9a0 = 5
    ?????? setssi indirizzi di memoria e valori differenti?
    come faccio a vedere il valore (aggiornato dal thread a) con una chiamata da parte del thread b?
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  8. #8
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    Originariamente inviato da nik600

    ?????? setssi indirizzi di memoria e valori differenti?
    come faccio a vedere il valore (aggiornato dal thread a) con una chiamata da parte del thread b?
    Eh.. che altro dovrebbe fare il programma? L'output è giusto.
    Gli indirizzi di memoria non lo so ma se non usi la funzione exec secondo me è giusto che restino uguali.
    Per quanto riguarda l'ultima domanda che hai fatto non l'ho proprio capita
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  9. #9
    come l'output è giusto?

    il processo figlio incrementa il valore di i...e lo stampa...fin qui tutto ok...ma quando il processo padre lo stampa il valore non è quello incrementato! come se la modifca fatta dal processo figlio sia "locale" come è possibile? dato che l'indirizzo di memoria della variabile che stampo è lo stesso?


    processo 2:0xbffff9a0 = 0
    processo 1:0xbffff9a0 = 5


    la domanda è: io voglio che l'output di processo 1 e 2 siano uguali...come faccio?
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  10. #10
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    è ovvio che ogni per ogni processo il valore di i cambia.
    il fatto che l'indirizzo della base della memoria dove il processo risiede nella memoria di sistema (cioè il tuo programma) sia uguale non c'entra.
    nel momento in cui crei due processi le variabili è come se si sdoppiassero
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

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.