|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
|
C, pipe e pipe con nome
Salve a tutti, sto provando a fare un piccolo programma concorrente in C. Il programma si compone in questo modo:
vi sono due programmi separati, uno che genera 3 processi e l'altro che non effettua nessuna fork. Il programma con 3 processi è macchina.c e genera 3 processi macchina, mentre l'altro programma è controllore.c. Il programma controllore.c genera 3 pipe con nome e 3 semafori (sempre pipe con nome). Dopo aver generato queste pipe con nome il programma invia un segnale sulla pipe della prima macchina e si pone in attesa dei dati da questa macchina (che risponde con un numero casuale tra 5 e 10), dopo aver ricevuto la risposta, chiede la stessa cosa alla seconda macchina e poi alla terza, il ciclo viene ripetuto all'infinito. Io ho creato così il programma controllore.c: // MAIN int main(){ int i; for(i=0; i<MACCHINE;i++){ if(mknod(semafori[i],MODE,0)==-1) printf("Impossibile creare il semaforo"); if(mknod(pippe[i],MODE,0)==-1) printf("Impossibile creare la pipe"); } write(1, "Faccio partire il controllore\n", strlen("Faccio partire il controllore\n")); controllore(); return 0; } //FUNZIONE CONTROLLORE: void controllore(){ int i; int sem[3]; //file descriptor semafori int pip[3]; //file descriptor pipe char buffer; //apro semafori e pipe for(i=0; i<MACCHINE; i++){ //semafori aperti in scrittura if( (sem[i]=open(semafori[i], O_WRONLY))==-1){ printf("impossibile aprire il semaforo"); exit(-1); } //pipe aperte solo in lettura if((pip[i]=open(pippe[i], O_RDONLY))==-1){ printf("impossibile aprire il semaforo"); exit(-1); } } while(1){ for(i=0; i<MACCHINE; i++){ printf("Sono il controllore, chiedo lumi alla macchina %d",i); char c='t'; write(sem[i], &c, 1);//invio segnale sul semaforo della macchina i read(pip[i], &buffer, 1);//leggo risposta dalla pipe su cui scrive i memcpy(&t, &buffer, 1); printf("Ho ricevuto questo tempo %d, da %d", t, i); t=0; } } //chiudo file descriptor for(i=0; i<MACCHINE; i++){ close(sem[i]); close(pip[i]); } } Programma macchina.c: //MAIN int main(){ int pid,i; //creo le macchine for(i=0; i<MACCHINE; i++){ write(1, "Macchina creata\n", strlen("Macchina creata\n")); if(pid=fork()<0){ printf("Errore nel fork"); exit(-1); } if(pid==0){ macchina(i); }else {;} } return 0; } //FUNZIONE MACCHINA: //prende il numero di macchina che le corrisponde void macchina(int com){ int sem, pip, durata; char buffer; if( (sem=open(semafori[com], O_RDONLY))==-1){ printf("impossibile aprire il semaforo"); exit(-1); } if( (pip=open(pippe[com], O_WRONLY))==-1){ printf("impossibile aprire il semaforo"); exit(-1); } while(1){ printf("Sono la macchina %d: ed attendo lumi.....", com); //attendo dati dal processo controllore, sono in attesa sulla pipe con nome che ha il ruolo di semaforo read(sem,&buffer,1); //durata operazione durata= 5 + rand()%6; char dur=durata; printf("Sono la macchina %d: la durata è: %d", com, durata); //scrivo sulla pipe la durata, la pipe è aperta in scrittura write(pip, &dur, 1); } //finito tutto chiudo i file descriptor close(sem); close(pip); } Ora se compilo e faccio partire i programmi, controllore.c mi stampa solo: write(1, "Faccio partire il controllore\n", strlen("Faccio partire il controllore\n")); mentre macchina.c mi stampa una volta sola, questo: write(1, "Macchina creata\n", strlen("Macchina creata\n")); Che errore commetto? Io non riesco a trovarlo, grazie a tutti, ciao ciao. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Feb 2002
Città: Modena
Messaggi: 592
|
Quote:
Codice:
if( (pid=fork()) < 0) In ogni caso anzichè lavorare con delle fork() hai provato ad usare i pthread ? Comunicazione e sincronizzazione dei processi sono molto più immediate! Ciauz Ultima modifica di vegeta83ssj : 15-04-2006 alle 13:50. |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
|
Grazie non me ne ero accorto delle parentesi tonde, le ho messe ed effettivamente mi vengono creati i tre processi, però non stampa le printf.
Ho cambiato le printf con delle write e così mi scrive a video? Perchè questo comportamento? Un'altra cosa, ogni processo macchina dovrebbe creare per gli affari suoi un numero casuale però stranamente ad ogni passaggio i tre processi mi danno sempre lo stesso numero. Sotto allego il nuovo metodo macchina (uguale ma con le write) ed un pezzo di output. OUTPUT: Macchina creata Macchina creata Macchina creata Attendo segnali dal semaforo Attendo segnali dal semaforo Attendo segnali dal semaforo Segnale arrivato Sono la macchina: 0, la durata è: 8 Attendo segnali dal semaforo Segnale arrivato Sono la macchina: 1, la durata è: 8 Attendo segnali dal semaforo Segnale arrivato Sono la macchina: 2, la durata è: 8 Attendo segnali dal semaforo Segnale arrivato Sono la macchina: 0, la durata è: 11 Attendo segnali dal semaforo Segnale arrivato Sono la macchina: 1, la durata è: 11 Attendo segnali dal semaforo Segnale arrivato Sono la macchina: 0, la durata è: 12 Segnale arrivato Sono la macchina: 1, la durata è: 12 Segnale arrivato Sono la macchina: 2, la durata è: 11 FUNZIONE MACCHINA: void macchina(int com){ int sem, pip, durata; char buffer; char buf[DIM]; if( (sem=open(semafori[com], O_RDONLY))==-1){ printf("impossibile aprire il semaforo"); exit(-1); } if( (pip=open(pippe[com], O_WRONLY))==-1){ printf("impossibile aprire il semaforo"); exit(-1); } while(1){ printf("Sono la macchina %d: ed attendo lumi.....", com); write(1,"Attendo segnali dal semaforo\n",strlen("Attendo segnali dal semaforo\n")); //attendo dati dal processo controllore read(sem,&buffer,1); write(1,"Segnale arrivato\n",strlen("Segnale arrivato\n")); //durata operazione durata= 5 + rand()%10; char dur=durata; snprintf(buf, sizeof(buf), "Sono la macchina: %d, la durata è: %d\n", com, durata); write(1,buf, strlen(buf)); write(pip, &dur, 1); durata=0; } close(sem); close(pip); } |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:16.



















