0
我正在爲我的外殼實現多管道。代碼的問題在於它不會將我最後一條命令的輸出打印到我的標準輸出中。有人可以幫忙嗎? executePipedCommands函數接受指向命令列表頭的指針多管道實施。不工作
我插入例如ls | more | grep s到我的命令列表。
struct cmd_t {
int nargs, maxargs;
char **args;
struct cmd_t *next;
};
typedef struct cmd_t *Cmd;
void executePipedCommands(Cmd command) {
int numPipes = -1;
Cmd temp = command;
int status;
int i = 0;
pid_t pid;
while(command!= NULL)
{
numPipes ++;
command = command->next;
}
printf("number of pipes : %d",numPipes);
int pipefds[2*numPipes];
for(i = 0; i < (numPipes); i++){
if(pipe(pipefds + i*2) < 0) {
perror("couldn't pipe");
exit(EXIT_FAILURE);
}
}
int j = 0;
while(command)
{
pid = fork();
if(pid == 0)
{
//if not last command
if(command->next)
{
if(dup2(pipefds[j + 1], 1) < 0)
{
perror("dup2");
exit(EXIT_FAILURE);
}
}
//if not first command&& j!= 2*numPipes
if(j != 0)
{
if(dup2(pipefds[j-2], 0) < 0)
{
perror(" dup2");///j-2 0 j+1 1
exit(EXIT_FAILURE);
}
}
for(i = 0; i < 2*numPipes; i++)
{
close(pipefds[i]);
}
if(execvp(*command->args, command->args) < 0)
{
perror(*command->args);
exit(EXIT_FAILURE);
}
}
else if(pid < 0)
{
perror("error");
exit(EXIT_FAILURE);
}
command = command->next;
j+=2;
}
/**Parent closes the pipes and wait for children*/
for(i = 0; i < 2 * numPipes; i++){
close(pipefds[i]);
}
for(i = 0; i < numPipes + 1; i++)
wait(&status);
}