我正在为我的 shell 实现多管道。代码的问题是它不会将管道中最后一个命令的输出打印到我的 STDOUT。有人可以帮忙吗?executePipedCommands 函数接受指向命令列表头部的指针
例如,我将 ls|more|grep 插入到我的命令列表中。
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);
}