Hi I'm having a bit of trouble with my pipe execute function, where I want a shell in C to be able to execute a pipe. arg1 is the input before the pipe and arg2 is the command after the pipe. I want the program to terminate after ctr -d but it seems to quit without it, the moment the code is executed. An example of my input is ls | wc, where arg1 = ls and arg2 = wc. Any help/ pointers will be greatly appreciated, thank you.
int executepipe (char ** arg1, char ** arg2) {
    int fds[2];
    int child=-1;
    int status = pipe(fds);
    if (status < 0)
    {
        printf("\npipe error");
        return -1;
    }
    int pid =-1;
    pid= fork();    
    while(1){
    if (pid < 0) { //error!
        perror("fork");
        exit(1);
    } 
    //child
   if (pid == 0){// child process  (command after the pipe)
        //signal(SIGINT, SIG_DFL);
        //signal(SIGQUIT, SIG_DFL); 
        close(fds[1]);//nothing more to be written
        dup2(fds[0], 0);    
        execvp(arg2[0], arg2);
        
        //if errors exist execv wouldn't have been invoked
        perror("cannot execute command");
        exit(1);
    }
  
    else { // parent process  (command before the pipe)
        close(fds[0]); 
        signal(SIGINT, SIG_DFL);
        signal(SIGQUIT, SIG_DFL);
        dup2(fds[1], 1);
        close(fds[1]);
        execvp(arg1[0], arg1);
        //if errors exist execv wouldn't have been invoked
        perror("cannot execute command");
        exit(1);
           
    }
        if ( wait(&child) == -1 ){
            perror("wait");}
}
        return 0;
};