PDA

Visualizza la versione completa : [C] Problema con segnali Linux


linux_r
20-06-2015, 21:46
Salve ,sapreste dirmi perchè questo programma mi da un errore di segmentation fault, oppure di illegal instruction



/*
* Realizzare un programma C e Posix sotto Linux che con l'uso dei segnali sincronizzi un processo padre ed
un processo figlio che scrivono e leggono, rispettivamente, un numero intero alla volta (da 1 a n, dove n
è passato da riga di comando) nella prima posizione di un file temporaneo opportunamente creato.
* */
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
int fdTemp,i;
void handler(int signum)
{
char c,num[100];
lseek(fdTemp,0,SEEK_SET);
if(signum==SIGUSR1)
{
sprintf(num,"%d",i);
if(write(fdTemp,num,strlen(num))<0)
{
perror("write");
exit(-1);
}
printf("processo %d scrivo %s\n",getpid(),num);
}
else if(signum==SIGUSR2)
{
while(read(fdTemp,&c,1)>0)
{
printf("Letto %c\n",c);
}
}


}

int main(int argc,char**argv)
{
struct sigaction act;
int n;
pid_t pid;
sigset_t mask,mask1,mask2;
act.sa_handler=handler;
n=atoi(argv[1]);
sigemptyset(&mask);
sigaddset(&mask,SIGUSR1);
sigaddset(&mask,SIGUSR2);
sigprocmask(SIG_BLOCK,&mask,NULL);
printf("Processo padre pid=%d n=%d\n",getpid(),n);
if((fdTemp=open("temp",O_RDWR|O_TRUNC|O_CREAT,S_IRUSR|S_IWUSR))<0)
{
perror("open");
exit(-1);
}
pid=fork();
if(pid==0)
{
sigaction(SIGUSR2,&act,NULL);
printf("Processo figlio pid=%d\n",getpid());
sigemptyset(&mask1);
for(i=1;i<=n;i++)
{
kill(getppid(),SIGUSR1);
sigsuspend(&mask1);

}
}
else if(pid>0)
{
sigaction(SIGUSR1,&act,NULL);
sigemptyset(&mask2);

for(i=1;i<=n;i++)
{
sigsuspend(&mask2);
kill(pid,SIGUSR2);

}
}

return 0;
}

Loading