Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    22

    [c] gestione uscita navi dal porto

    Devo terminare un programma che gestisce un porto capiente 10 navi a cui si puo accedere tramite un canale a senso unico alternato.
    Le navi dopo essere entrate restano nel porto un tot di tempo per scaricare le merci e poi ripartono se il semaforo di uscita è verde.
    Il mio problema è che con la fork c'e un'esecuzione del tipo:
    padre
    figlio 1
    padre
    figlio 2
    padre
    figlio 3

    quindi mettendo l'uscita della nave nel codice di figlio 1 la seconda nave non entra finche nn è stato eseguito il codice della prima e quindi nel porto mi entra sempre solo una nave dopo l'uscita della precedente

    come posso risolvere il problema?

  2. #2
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    tu vorresti un esecuzione contemporanea di più processi, ciò non è possibile

    hai tralasciato però qualche dettaglio importante: ovvio che l'esecuzione è quella che hai descritto se crei il figlio, lo esegui e lo uccidi, ma se gestisci meglio "il movimento delle navi" non è così.
    Io ho pensato ad una soluzione con un file per ogni nave, può andare bene?
    ossia: un processo che setta 2 semafori: un semaforo con 10 risorse (i posti) e un semaforo per l'entrata/uscita, per simulare l'entrata di ogni nave avvii un eseguibile diverso (ovviamente sempre lo stesso eseguibile ma diversi processi)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    22
    io ho usato un processo nave un processo canale (che gestisce il semaforo contatore x le 10navi e il semaforo entrata/uscita) e la capitaneria che pero mi servira successivamente

    il problema è che nn so dove inserire il codice per fare uscire la nave... ossia che controlla che il semaforo uscita sia verde e rilascia il posto occupato... xk mettendolo nel codice del figlio nn entra la seconda nave finche la prima nn ha scaricato ed è ripartita

    Ho pensato di gestire la cosa con un alarm(tempo di scarico della nave) in modo k nel mentre il programma continua a fare entrare le altre navi.. ma nn so se possa essere un'idea..

    che ne dici?

  4. #4
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    Originariamente inviato da superiso
    io ho usato un processo nave un processo canale (che gestisce il semaforo contatore x le 10navi e il semaforo entrata/uscita) e la capitaneria che pero mi servira successivamente

    il problema è che nn so dove inserire il codice per fare uscire la nave... ossia che controlla che il semaforo uscita sia verde e rilascia il posto occupato... xk mettendolo nel codice del figlio nn entra la seconda nave finche la prima nn ha scaricato ed è ripartita

    Ho pensato di gestire la cosa con un alarm(tempo di scarico della nave) in modo k nel mentre il programma continua a fare entrare le altre navi.. ma nn so se possa essere un'idea..

    che ne dici?
    certo i segnali sono una soluzione, ma una cosa non è chiara: la nave in porto viene, aspetta un tempo fisso (comune a tutte) e va via?

    come ti ho detto per ora non vedo lati negativi o impedimenti a fare un programma nave.c (da avviare per ogni nave che vuoi far entrare)
    il programma è così strutturato:
    -preleva una risorsa dal semaforo entrata/uscita (quindi se è occupato rimane in attesa)
    -entra nel porto preleva una risorsa dal semaforo coi 10 posti e parte un timer
    -alla ricezione di SIGALRM rilascia la risorsa dal semaforo coi 10 posti e occupa una dal semaforo entrata/uscita

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    22
    la nave entra nel porto aspetta un tot che è salvato nella struttura nave (precisamente in un int nave.ora che varia in base alla merce e quantità trasportata) e poi riparte

    praticamente ho il processo nave.c che si forka per il numero di navi che vengono create... per risolvere il problema dici di utilizzare la sigalarm? il fatto è che nn mi è molto chiara

    praticamente gestisco la sigalarm con un handler che poi farà uscire la nave e rilascerà la risorsa e il segnale lo lancio con alarm(nave.ora)?

  6. #6
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    ti ripeto che io avevo pensato di avviare nave.c una volta per ogni nave, tu insisti con la fork, è proprio necessaria ai fini dell'esercizio?

    cmq a questo punto se postassi almeno una bozza di codice faremmo prima

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    22
    si la fork è obbligatoria dato che è la parte principale del lavoro...

    ti posto il codice di nave.c (dove sta il problema) se poi vuoi anche gli altri te li passo

    codice:
    #include "libporto.h"
    
    int main()
    {
    	int pid_canale;    //pid del canale
    	int pid_capitaneria;    //pid della capitaneria
    	int num_navi;    //numero di navi create
    	int i;    //indice per il ciclo for
    	int pid;	//pid per la fork()
    	int wait_son;		//wait()
    	int senso_unico;    //indirizzo del pool di semafori del senso unico alternato
    	int sem_cont;    //indirizzo del semaforo contatore
    	boat nave;    //struttura contenente i dati della nave
    	msgpid canale_pid;    //messaggio con pid del canale
    	msgpid capitaneria_pid;    //messaggio con pid della capitaneria
    	
    	sem_cont = crea_semafori(1, SEMCONT);    //crea il semaforo contatore
    	semctl(sem_cont, 0, SETVAL, 10);    //inizializza il semaforo contatore
    	
    	printf("Il pid di nave è: %d\n", getpid());    //stampa il pid del processo	
    	
    	invia_pid(getpid(), "NAVE", PID_NAVE);    //invia il pid agli altri processi
    	invia_pid(getpid(), "NAVE", PID_NAVE);
    	
    	printf("Attendo i pid degli altri due processi\n");
    	
    	printf("Quante navi vuoi gestire? ");
    	scanf("%d", &num_navi);
    	
    	//esegue finché non ottiene i pid dei due processi complementari
    	do{
    		if(strcmp(canale_pid.mittente, "CANALE") != 0)
    		{
    			canale_pid = ricevi_pid(PID_CANALE);    //riceve il messaggio
    			pid_canale = canale_pid.p_npid;    //assegna il pid
    		}
    		
    		if(strcmp(capitaneria_pid.mittente, "CAPITANERIA") != 0)
    		{
    			capitaneria_pid = ricevi_pid(PID_CAPITANERIA);    //riceve il messaggio
    			pid_capitaneria = capitaneria_pid.p_npid;    //assegna il pid
    		}
    	} while(strcmp(canale_pid.mittente, "CANALE") != 0 || strcmp(capitaneria_pid.mittente, "CAPITANERIA") != 0);
    	
    	printf("PID_CANALE è %d\n", pid_canale);
    	printf("PID_CAPITANERIA è %d\n", pid_capitaneria);
    	
    	senso_unico = semget(SEMALT, 0, 0);
    	
    	for(i = 1; i <= num_navi;)    //ciclo for necessario per creare i processi figlio
    	{    //APERTURA FOR
    		
    		pid = fork();    //fork() su pid per creare il figlio
    		if(pid)    //if(pid != 0) entro nel codice del processo padre
    		{    //APERTURA IF-THEN(1)
    			printf("SUN EL PARE\n");
    			i++;    //incremento l'indice del ciclo for per evitare il loop
    			fflush(stdout);    //chiude lo stream
    						
    			wait_son = wait(0);	//il processo padre aspetta la terminazione del processo figlio
    			fflush(stdout);    //chiude lo stream
    			
    		}    //CHIUSURA IF-THEN(1)
    		else    //if(pid == 0) entro nel codice del processo figlio
    		{    //APERTURA IF-ELSE(1)
    			
    			printf("SONO IL FIGLIO\n");
    			S(senso_unico, 0);    //controllo per l'accesso al porto
    			P(sem_cont, 0);    //decremento il valore del semaforo
    			nave = crea_nave(i);    //creazione della nave
    			invia_msg(getpid(), nave);    //invio messaggio a capitaneria
    			kill(pid_capitaneria, SIGINT);    //segnala l'invio del messaggio
    			//S(senso_unico, 1);
    			//V(sem_cont, 0);
    			
    			
    			i = num_navi + 1;    //incremento dell'indice per l'uscita dal ciclo
    			fflush(stdout);    //chiude lo stream
    
    				
    		}    //CHIUSURA IF-ELSE(1)
    	}    //CHIUSURA FOR
    	
    	return 0;
    }

  8. #8
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    e cosa dovrei capire? hai almeno 5 funzioni non postate
    non ho capito il senso del do while: a chi invii i pid e da chi li ricevi?

    quando non c'è bisogno non usare le funzioni

    dov'è che gestisci quanto deve aspettare la nave nel porto? nell'handler di SIGINT?
    non ho provato, ma sei sicuro che il for crei un numero di processi = num_navi?

  9. #9
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Piccola nota: fflush(stdout) non chiude lo stream!!
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  10. #10
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    Originariamente inviato da Alex'87
    Piccola nota: fflush(stdout) non chiude lo stream!!
    si avevo notato ma ho tralasciato di obiettare su questo, è chiaro anche dagli altri commenti e qualche passaggio maldestro che proviene da un altro linguaggio

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.