我已经尝试学习 Linux 内部结构一个月了,我尝试为 n+1 个函数创建 n 个管道,但出了问题,而且我不知道出了什么问题。所以,我在大家的关注下提交了我的代码,我需要有人帮助我
int main(int argc, char *argv[])
{
int i = 0,pp[5],j = 0,fd[2];
pipe(fd);
while(argv[i])
{
if(!strcmp(argv[i],"|"))
{
argv[i] = '\0';
pp[j++] = i;
}
i++;
}
for(int i = 0;i < j;i++)
{
if(i < j-1)
pid_t pid = fork();
if(pid)
{
int stat;
wait(&stat);
dup(fd[1]);
close(fd[1]);
close(0);
dup(fd[0]);
execvp(argv[pp[i]+1],argv + (pp[i]+1));
}
else
{
dup(fd[0]);
close(fd[0]);
close(1);
dup(fd[1]);
execvp(argv[pp[i]],argv + pp[i]);
}
}
}
if(pid)
{
// ...
execvp(argv[pp[i]+1],argv + (pp[i]+1));
}
else
{
// ...
execvp(argv[pp[i]],argv + pp[i]);
}
n 必须为 1。
我建议你从头开始重建你的算法。类似于(伪代码)
set argmarker = 0
for each argument
if argument == "|"
create pipe
create child process
if child process
dup2 pipe output to handle 1
close pipe handles
exec()
dup2 pipe input to handle 0
close pipe handles
set argmarker = next argument
if any arguments left
exec()
我还省略了错误处理;你需要检查 pipeline()、fork() 或 exec() 是否失败。