根据我的理解,我不需要知道前面的管道数量(尽管我可以,我使用链表实现它)。我有一个名为cmdLine
的结构:
typedef struct cmdLine
{
char* const arguments[MAX_ARGUMENTS];
int argCount;
char const *inputRedirect;
char const *outputRedirect;
char blocking;
int idx;
struct cmdLine *next;
} cmdLine;
这是执行的功能(只有代码的一部分重要):
void execute(cmdLine *pCmdLine)
{
int status = 0;
int fd[2];
pid_t id;
if(pCmdLine->next)
{
if(pipe(fd) == -1)
{
perror("Error opening pipe.\n");
exit(1);
}
if(pCmdLine->idx == 0)
{
dup2(fd[1], 1);
close(1);
close(fd[0]);
}
else
{
dup2(fd[0], 0);
close(0);
dup2(fd[1], 1);
close(1);
}
execute(pCmdLine->next);
close(fd[0]);
close(fd[1]);
waitpid(id, &status, 0);
}
id = fork();
if(id == 0)
{
if(execvp(pCmdLine->arguments[0], pCmdLine->arguments) == -1)
{
perror("execvp failed.\n");
exit(1);
}
close(fd[0]);
close(fd[1]);
exit(0);
}
if(pCmdLine->blocking)
{
waitpid(id, &status, 0);
}
if(pCmdLine->next)
{
execute(pCmdLine->next);
close(fd[0]);
close(fd[1]);
}
}
基本上,如果它是第一个命令我关闭输入管道(因为它无法获得任何输入)并将fd[1]
替换为stdout
所以当我激活{ {1}}下一次从前一个命令执行输入并且输出进入下一个命令,直到它是最后一个命令 - 当它只获得输入并关闭输出管道时。我不明白问题出在哪里,当我输入类似execvp()
的东西时,它打印出WHOLE文件夹的长列表,然后它被卡住(好像得到了输入 - 虽然我输入了很多输入和准备分段错误没有任何反应。)
有什么问题?我该如何解决?我想我根本没有朝着正确的方向前进,我真的需要帮助。