我正在为我的shell实现多管道。代码的问题是它不会将管道中最后一个命令的输出打印到我的STDOUT。有人可以帮忙吗? 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);
}
答案 0 :(得分:0)
您的代码会逐步浏览链接列表,从command
开始并在到达结尾时停止,以计算所需的管道数量。不幸的是,您没有将列表重置回起点,因此您无法单步执行列表来执行命令,因为您已经在最后。
你可能想写:
int numPipes = -1;
Cmd temp = command;
while (temp != NULL)
{
numPipes++;
temp = temp->next;
}
printf("number of pipes: %d\n", numPipes);
变量temp
未被使用。或者你可以写:
int numPipes = -1;
Cmd temp = command;
while (command != NULL)
{
numPipes++;
command = command->next;
}
printf("number of pipes: %d\n", numPipes);
command = temp;