Processi e segnali - problemi uso fork

di il
4 risposte

Processi e segnali - problemi uso fork

Salve ragazzi in precedenza ho gia scritto in questo forum e mi sono trovato molto bene, ora ho necessita di chiedervi nuovamente aiuto, insomma non so dove altro sbattere la testa per risolvere il mio problema.
Sto lavorando con i processi concorrenti e la gestione dei segnali su c e nel momento un cui uso la funzione fork sembra che il programma non vada mai nel codice del processo figlio cosa molto strana dato che ne ho scritti altri di programmi con i processi e non hanno mai dato problemi.
Vi posto il codice cosi capite meglio:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>

 
void procedi(int sig)
{
	
};

int main(int argc, char *argv[])
{
	int N,r,i,wrt,rdn;
	pid_t pid;
	int *status;
	int pp[2];    
	r=pipe(pp);   
	if (r < 0) 
	{
		printf ("\nErrore nella creazione della pipe\n");          
		exit(1);
	}
	else
	printf("PIPE CREATA CORRETTAMENTE\n");
	printf("quanti prodotti si vogliono consegnare? "); scanf("%d",&N); 
	pid=fork();  
	signal(SIGUSR1,procedi);   
	for (i=0;i<N;i++)
	{		
		if (pid==0)    //sono nel figlio
		{
			close(pp[1]);
			
			pause();
			printf("ho ricevuto il segnale SIGUSR1");
			read(pp[0],&rdn,1); 		 
			printf("\nil consumatore %d ha consumato il prodotto numero %d \n",getpid(),i+1);  
			kill(getppid(),SIGTERM);      	
		}		
		if (pid>0)      //sono nel padre
		{
			
			wrt=rand()%10;  	//sto generando un numero casuale tra 0 e 9
			close(pp[0]);       	
			write(pp[1],&wrt,1);  	/
			printf("\nil produttore %d ha consegnato il prodotto numero %d \n",getppid(),i+1);		
			kill(getpid(),SIGUSR1);	
			pause();
		}	
		if (pid==-1) //errore pid=-1
		printf("\nerrore nella creazione dei processi\n");
	};
	printf("\n");
return(0);	
};
In pratica il problema sta quando devo inviare il segnale al figlio, e so che in genere si fa il contrario, il segnale viene inviato correttamente, pero tutto cio che è presente nel figlio non viene eseguito, sia prima di pause() che dopo. Il mio dubbio sta nella pipe, dato che è la prima volta che la uso pero il fatto è che avevo gia scritto questo codice il precedenza senza l'uso dei segnali, solo con la syscall sleep() per sincronizzare, e tutto andava bene, ora con l'aggiunta dei segnali non va e ripeto non è la prima volta che li uso piu

4 Risposte

  • Re: Processi e segnali - problemi uso fork

    Inizia con postare codice funzionante:

    che ci fanno quei 'pause()' in mezzo al codice?
    perche' chiudi la pipe ancora prima di utilizzarla?
    perche' i processi si suicidano ancora prima di attendere di fare quello che devono fare?

    Ho dovuto commentare mezzo codice per ottenere un comportamento decente. Nota: solo commentare codice inutile, senza nessun'altra modifica, ed il tutto funziona ragionevolmente bene. Non bene, perche' ci sono diversi errori concettuali, ma per un primo esperimento puo' anche andare.

    Devi studiare meglio che cosa vuol dire fare programmazione concorrente: non c'e' nulla di magico. Ad esempio, non puoi pretendere che il sistema funzioni se non gli dai il tempo di fare quello che deve fare.

    Devi ragionare in termini di 2 o piu' programmi distinti, eseguiti da due computer con diverse potenze di calcolo. Quindi non puoi fare affidamento su fortunose temporizzazioni. Se i due programmi si devono coordinare tra di loro, ci devono essere delle strutture di controllo di tipo concorrente che ne assicurano la sincronizzazione.

    Il trucco del 'pause()' funziona solo per l'esempietto di prova. In un'applicazione minimamente un po' piu' complessa, non funziona piu', anzi, rischi casini incomprensibili.

    L'utilizzo del fork nella programmazione concorrente e' stato surclassato dal paradigma della programmazione multithreading: molto piu' potente e comprensibile. Il fork va bene per il programmino di 10 righe, ma inutile in qualunque altra situazione.
  • Re: Processi e segnali - problemi uso fork

    I pause() che ho messo li ho inseriti proprio per creare una sincronizzazione tra i due processi, il figlio attende un segnale dal padre prima di proseguire

    i close sulla pipe chiudono i canali di scrittura/lettura per il figlio/padre una cosa non necessaria insomma

    il fatto pero, quello che volevo dire nel post, è che in ogni caso, con o senza pause il codice figlio non viene proprio eseguito, dentro (if pid==0) non ci va proprio, o almeno quello che mi è sembrato di capire
  • Re: Processi e segnali - problemi uso fork

    Il pause non serve, ed e' pure sbagliato.
    Il codice funziona se rimuovi tutto il codice inuile.

    Leggi meglio quello che ti ho scritto precedentemente
    
    PIPE CREATA CORRETTAMENTE
    quanti prodotti si vogliono consegnare? 8
    
    il produttore 8312 ha consegnato il prodotto numero 1 
    
    il produttore 8312 ha consegnato il prodotto numero 2 
    
    ho ricevuto il segnale SIGUSR1
    il produttore 8312 ha consegnato il prodotto numero 3 
    il consumatore 8456 ha consumato il prodotto numero 1 
    
    il produttore 8312 ha consegnato il prodotto numero 4 
    
    ho ricevuto il segnale SIGUSR1
    il produttore 8312 ha consegnato il prodotto numero 5 
    il consumatore 8456 ha consumato il prodotto numero 2 
    
    ho ricevuto il segnale SIGUSR1
    il produttore 8312 ha consegnato il prodotto numero 6 
    il consumatore 8456 ha consumato il prodotto numero 3 
    
    il produttore 8312 ha consegnato il prodotto numero 7 
    ho ricevuto il segnale SIGUSR1
    il consumatore 8456 ha consumato il prodotto numero 4 
    
    ho ricevuto il segnale SIGUSR1
    il produttore 8312 ha consegnato il prodotto numero 8 
    il consumatore 8456 ha consumato il prodotto numero 5 
    
    ho ricevuto il segnale SIGUSR1
    il consumatore 8456 ha consumato il prodotto numero 6 
    ho ricevuto il segnale SIGUSR1
    il consumatore 8456 ha consumato il prodotto numero 7 
    ho ricevuto il segnale SIGUSR1
    il consumatore 8456 ha consumato il prodotto numero 8 
    
    
    RUN SUCCESSFUL (total time: 3s)
    
    
  • Re: Processi e segnali - problemi uso fork

    Ok ho capito perche i pause sono inutili, ho rivisto anche un po di concetti teorici sulla pipe ed ho fatto chiarezza, una cosa soltanto, perche sono messi sbagliati? voglio dire ipoteticamente dovrebbero funzionare. Comunque grazie infinite per l'aiuto
Devi accedere o registrarti per scrivere nel forum
4 risposte