我已经尝试在我的代码中实现管道,它接受字符串,将它分成几个命令(结果 - 参数),执行(execvp)和使用管道写/读结果,但我在最后一步卡住了。 / p>
为了解决这个问题,我尝试过使用for循环 1.第一个元素写道, 2.中间读/写, 3.最后一个读。
我尝试过使用2对读/写文件描述符来解决它。
代码编译,但不起作用。我的猜测是我正在使用close和文件描述符不正确。
功能:
int exec_multi(char*** args, int count)
{
int pipefd1[2];
int pipefd2[2];
int pid;
int i;
char ** arguments;
for (i = 0; i < count; i++)
{
arguments = args[i];
if (i==0)
{
printf("Write %i\n", i);
if (pipe(pipefd1) == -1) {
perror("Shell: Piping error\n");
exit(1);
}
if ((pid = fork()) == -1) {
perror("Shell: Forking error\n");
exit(1);
} else if (pid == 0) {
printf("first shit\n");
dup2(pipefd1[1], STDOUT_FILENO);
close(pipefd1[0]);
close(pipefd1[1]);
execvp(arguments[0], arguments);
perror("Shell: Executing error\n");
_exit(1);
}
}
else if (i==(count-1))
{
printf("Read %i\n", i);
if ((pid = fork()) == -1) {
perror("Shell: Forking error\n");
exit(1);
} else if (pid == 0) {
printf("last sh\n");
dup2(pipefd1[0], STDIN_FILENO);
close(pipefd1[0]);
close(pipefd1[1]);
execvp(arguments[0], arguments);
perror("Shell: Executing error\n");
_exit(1);
}
}
else
{
printf("Read & write %i\n", i);
if (pipe(pipefd2) == -1)
{
perror("Shell: Piping error\n");
exit(1);
}
if ((pid = fork()) == -1) {
perror("Shell: Forking error\n");
exit(1);
} else if (pid == 0) {
dup2(pipefd1[0], STDIN_FILENO);
dup2(pipefd2[1], STDOUT_FILENO);
close(pipefd1[0]);
close(pipefd1[1]);
pipefd1[0] = pipefd2[0];
pipefd1[1] = pipefd2[1];
close(pipefd2[0]);
close(pipefd2[1]);
execvp(arguments[0], arguments);
perror("Shell: Executing error\n");
_exit(1);
}
}
}
return 1;
}