Salve a tutti, sto avendo un problema riguardo l'ultimo esercizio che sto cercando di svolgere: da in output Segmentation fault ma non capisco dove sbagli in quanto sono alle prime armi con C.

Sostanzialmente il programma è una sorta di grep: deve visualizzare a video solo le righe del file di testo indicato che contengono una parola specificata.
Il processo Reader deve leggere il contenuto del file e passarlo al padre tramite una pipe, il padre seleziona solo le righe contententi la parola indicata passandole poi ad un altro processo chiamato writer.

Adesso non capisco se ho sbagliato qualcosa a livello di funzioni (molto probabilmente il metodo di per se è sbagliato ma vorrei capire se ho sbagliato a dichiarare o invocare qualcosa in quanto da solo non riesco a capirci nulla)

codice:
#include <stdio.h>#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <string.h>
#include <sys/msg.h>


#define BUFSIZE 1024
#define MAXDIM 1024
#define END_OF_FILE 3
typedef struct {
    long type;
    char text[MAXDIM];
} msg;


/*processo R leggerà il contenuto del file indicato
e lo passerà al padre attraverso la pipe;*/
void reader(int pipefd,const char *input){
    FILE *input_file, *output_file;
    char buffer[BUFSIZE];


    if((input_file = fopen(input,"r")) == NULL){
        perror("fopen");
        exit(1);
    }


    if((output_file = fdopen(pipefd,"w")) == NULL){
        perror("fdopen");
        exit(1);
    }


    while(fgets(buffer,BUFSIZE,input_file)!=NULL)
        fputs(buffer,output_file);


/*
    if(write(pipefd,buffer,strlen(buffer)+1) == -1){
        perror("pipe");
        exit(1);
    }
*/
    //close(input_file);
    exit(0);
}


void padre(int pipefd, int coda_msg, char *findme){
    FILE *input_file;
    char buffer[BUFSIZE];
    msg messaggio;
    int fd;


    if((input_file = fdopen(pipefd,"r")) == NULL){
        perror("pipe");
        exit(1);
    }


    while(fgets(buffer,BUFSIZE,input_file) != NULL){
        if(strcmp(findme,buffer)){
            strncpy(messaggio.text,buffer,BUFSIZE);
            messaggio.type = 1;
            if(msgsnd(coda_msg,&messaggio,sizeof(messaggio)-sizeof(long),0) == -1){
                perror("msgsnd");
                exit(1);
            }
        }
    } 


    messaggio.type = END_OF_FILE;
    msgsnd(coda_msg,&messaggio,sizeof(messaggio)-sizeof(long),0);


    close(pipefd);    


    exit(0);


}


void writer(int coda_msg){
    msg messaggio;
    char risultati[MAXDIM];


    if(msgrcv(coda_msg,&messaggio,sizeof(messaggio)-sizeof(long),0,0) == -1){
        perror("msgrcv");
    } else if(messaggio.type == END_OF_FILE){
        printf("Fine del file\n");
        exit(1);
    }


    strcpy(risultati,messaggio.text);


    printf("Parole: %s ", risultati);


    exit(0);
}


int main(int argc , char **argv){
    char *input;
    msg messaggio;
    int ds_coda;
    int pipefd[2];
    char *trovami;


    if(argc != 3){
        printf("Sei sbagliato\n");
        exit(1);
    } /*else {
        strcpy(input,argv[2]);
        strcpy(trovami,argv[1]);
    }*/
    
    printf("Programma avviato con successo\n. Parola da cercare '%s' su file '%s'",trovami,input);




    if((ds_coda = msgget(IPC_PRIVATE,IPC_CREAT|0600)) == -1){
        perror("msgget");
        exit(1);
    }


    if(pipe(pipefd) == -1){
        perror("pipe");
        exit(1);
    }


    if(fork()==0){
        close(pipefd[0]);
        reader(pipefd[1],input);
    }
    close(pipefd[1]);
    padre(pipefd[0],ds_coda,trovami);
    
    close(pipefd[0]);
//    close(pipefd[1]);


    if(fork()==0){
        writer(ds_coda);
    }


    msgctl(ds_coda,IPC_RMID,0);


    exit(0);
}