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