gpt4 book ai didi

c - 管道将一个程序的标准输出重定向到另一个程序的标准输入

转载 作者:太空宇宙 更新时间:2023-11-04 04:24:57 25 4
gpt4 key购买 nike

我们必须编写一个 C 程序,使用管道将一个命令/程序的标准输入重定向到另一个命令/程序的标准输出。如果命令行上的程序是通过 ./a.out ls -l\; more,它应该将 ls -l 的标准输出重定向到 more,以 \; 为分隔符。该程序应该适用于我们路径中的任何命令/程序,因此:./a.out cat filename.c\;更多,应该与键入相同:cat filename.c |更多

我的问题是我的程序似乎无法正确执行,或者管道没有按预期工作。基本上,除了我放置的打印语句调试之外,我没有得到任何输出。具体来说,程序会打印:Exec... 然后是 ERROR,这些都在父代码中。

  #include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void pipeit(char * pro1, char * pro2, char * p1args[], char * p2args[])
{
pid_t pid;
int fd[2];
int st;
pipe(fd);
pid = fork();

if(pid < 0)
{
printf("Error Forking...\n");
exit(-1);
}
else if(pid == 0)
{
dup2(fd[1],1);
close(fd[0]);
close(1);
printf("Exec 1...\n");
execv(pro1, p1args);
printf("ERROR\n");
}
else
{
waitpid(pid,&st,0);
if(st<0)
{
printf("Child Error\n");
}
dup2(fd[0],0);
close(fd[1]);
close(0);
printf("Exec...\n");
execv(pro2,p2args);
printf("ERROR\n");
}
return;
}
/* THIS IS JUST COMMAND LINE PARSING */
int main(int argc, char * argv[])
{
int i = 1;
char * pro1;
char * pro2;
char * first[argc+1];
char * second[argc+1];
while(i<argc && argv[i][0] != ';')
{
if(i == 1)
{
pro1 = argv[i];
}
else
{
first[i] = argv[i];
}
i++;
}
first[i] = NULL;
while(i<argc)
{
if(argv[i][0] == ';')
{
i++;
pro2 = argv[i];
}
else
{
second[i] = argv[i];
}
i++;
}
second[i] = NULL;
pipeit(pro1,pro2,first, second);
return 0;
}

最佳答案

在 child 身上,你有:

    dup2(fd[1],1);
close(fd[0]);
close(1);

这会将管道复制到标准输出,但随后会关闭标准输出。通过不关闭标准输出并关闭管道的两端来修复。经验法则:如果将管道的一端复制到标准输入、输出或错误,则应关闭两个原始管道描述符。

    dup2(fd[1],1);
close(fd[0]);
close(fd[1]);

您在关闭标准输入的父级中遇到了类似的问题。

您还把 wait() 放在了错误的位置。这些进程必须同时运行。如果管道中的第一个进程生成的数据太多以至于管道无法容纳所有数据,则该进程将阻塞。如果另一个进程在读取任何内容之前等待第一个进程结束,则它不会正常工作。

关于c - 管道将一个程序的标准输出重定向到另一个程序的标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42589626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com