I want to make a simple shell with pipe. I think I almost did it but it does not return to main. I think exec is not finishing. Below is part of my code. I parsed the command to blocks of struct defined as below. symbol type 5 means that it has | . when I run this program, this is result image. when I don't use pipe, it returns and prints > again but when I use pipe it doesn't.
typedef struct Command {
char *file; // file to execute
char **arglist; // argument list to executable
SymbolType symbolType; // command seperator
int status; // exit code of the commnad
struct Command *next, *prev;
} Command;
void GetPipe(Command *command, int *fd){
SymbolType symbol = command->symbolType;
if(symbol==5){
close(1);
close(fd[0]);
dup2(fd[1],1);
}
if((command->prev)!=NULL) symbol=command->prev->symbolType;
if(symbol==5){
close(0);
close(fd[1]);
dup2(fd[0],0);
}
}
void ExecuteCommand(Command *command){
int fd[2];
pipe(fd);
for(;command!=NULL;command=command->next){
pid_t pid = fork();
if(pid<0) exit(1);
else if(pid==0){
GetPipe(command, fd);
if (execvp(command->file, command->arglist)==-1){
command->status=status_failure; exit(1);}}
else {
int status;
//waitpid(pid, &status, 0);
wait(&status);
}
}
close(fd[0]);
close(fd[1]);
}
int main(void){
Command *head = NULL;
int should_run = 1;
while (should_run){
printf("> ");
fflush(stdout);
GetCommandChain(&head);
ExecuteCommand(head);
DeleteCommandChain(head);
}
}