Salve ,sapreste dirmi perchè questo programma mi da un errore di segmentation fault, oppure di illegal instruction

codice:
/*
 * 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;
}