【发布时间】:2021-07-19 16:23:07
【问题描述】:
//I want to execute pwd|sort > file.txt
char commands[2][30] = {"pwd", "sort"};
char directory [2][30] = {"/usr/bin/pwd", "/usr/bin/sort"}
char outputFile[30] = "file.txt"
int totalCommands = 2;
bool isOutputFilePresent = true;
//creating two pipes
int fd1[2];
int fd2[2];
pipe(fd1);
pipe(fd2);
//Closing the writing ends but keeping the reading ends open as closing them will destroy both the pipes
close (fd1[1]);
close (fd2[1]);
//loop to execute each command by creating a child process in each iteration
for (int i = 0; i < totalCommands; ++i)
{
pid_t pid = fork();
if (pid == 0)
{
if (i == totalCommands - 1)
{
if (i%2 == 0)
{
close(fd1[1]);
close(fd2[0]);
dup2(fd1[0], 0);
dup2(fd2[1], 1);
}
else
{
close(fd2[1]);
close(fd1[0]);
dup2(fd2[0], 0);
dup2(fd1[1], 1);
}
}
else
{
if (i%2 == 0)
{
close(fd2[0]);
close(fd2[1]);
close(fd1[1]);
dup2(fd1[0], 0);
}
else
{
close(fd1[0]);
close(fd1[1]);
close(fd2[1]);
dup2(fd2[0], 0);
}
if(isOutputFilePresent)
{
int outputFD = open (outputFile, O_WRONLY | O_CREAT);
dup2(outputFD, 1);
}
}
execv(directory[i], commands[i]) //ignore the fact that i am passing command name instead of argument vector
}
wait(NULL);
}
由于子进程将继承它自己的管道 FD,我关闭了每个进程中未使用的管道,并使用 dup2 为其分配了 stdout 和 stdin FD。但是这段代码有一个逻辑错误,我猜是因为没有正确使用管道。那么我在管道的概念上哪里弄错了,这个问题的解决方案是什么。谢谢!
【问题讨论】: