Scrivere un programma in C in cui vengano effettuate le seguenti operazioni:
-un processo legge da tastiera un intero n, con pari;
-crea n processi figli, scrive i pid dei figli in un nuovo file figli.dat e invia un segnale SIGUSR1
a tutti i figli;
-appena ricevuto il segnale dal padre, il processo p0 invia il segnale SIGUSR2 al processo p2, che dopo averlo ricevuto,
lo invia al prossimo processo di indice pari. L' ultimo processo di indice pari blocca la catena.Lo stesso fanno i processi
dispari a partire da p1.
Riscontro problemi nell' implementazione dell' ultimo punto, trovo inconcepibile che un processo non ancora inizializzato possa settare un handler per ricevere il segnale. Dunque confido in un' idea vostra. Vi posto la mia soluzione sbagliata per l' ultimo punto. Grazie a chiunque mi aiuterà.
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
void gest(int pam);
int main()
{
int n,fd;
char buff[5];
do
{
printf("inserisci numero intero pari\n");
scanf("%d",&n);
if(n%2!=0)
{
perror("numero inserito dispari\n");
}
}
while(n%2!=0);
pid_t pid[n];
for(int i=0;i<n;i++)
{
pid[i]=fork();
if(pid[i]==0)
{
printf("figlio %d mi metto in attesa della kill\n",i);
signal(SIGUSR1,gest);
pause();
if(i%2==0)
{
/* NON EFFICACE
if(i>0)
{
signal(SIGUSR2,gest);
pause();
}
kill((getpid()+2),SIGUSR2);
*/
}
exit(i);
}
else
{
sprintf(buff,"%d\n",pid[i]);
fd=open("figli.dat",O_CREAT|O_RDWR|O_APPEND,0777);
write(fd,&buff,strlen(buff));
sleep(1);
kill(pid[i],SIGUSR1);
waitpid(pid[i],NULL,0);
}
}
}
void gest(int pam)
{
if(pam==SIGUSR1)
{
printf("ho ricevuto il segnale 1...\n");
}
else
{
printf("ho ricevuto il segnale 2\n");
}
}
