将两个命令与fork、execvp连接起来,然后将输出重新定向到套接字
我有两个命令cmd1和cmd2,我必须在子级中执行cmd1,将输出重定向到另一个子级,然后以cmd1的输出作为参数执行cmd2。然后我必须将输出重定向到与套接字连接的远程客户端(telnet)。我无法找出问题所在,但我的解决方案没有将cmd1输出重定向到cmd2将两个命令与fork、execvp连接起来,然后将输出重新定向到套接字,c,sockets,pipe,fork,exec,C,Sockets,Pipe,Fork,Exec,我有两个命令cmd1和cmd2,我必须在子级中执行cmd1,将输出重定向到另一个子级,然后以cmd1的输出作为参数执行cmd2。然后我必须将输出重定向到与套接字连接的远程客户端(telnet)。我无法找出问题所在,但我的解决方案没有将cmd1输出重定向到cmd2 if(fork() == 0) { //Process to compute cmd1 char *arg[2]; arg[0] = cmd1; arg[1
if(fork() == 0)
{
//Process to compute cmd1
char *arg[2];
arg[0] = cmd1;
arg[1] = NULL;
dup(piped[1]);
close(piped[0]);
close(piped[1]);
execvp(cmd1,arg);
}
if(fork() == 0)
{
//Process to compute cmd2
dup2(newsockfd,STDOUT_FILENO);
dup2(newsockfd,STDERR_FILENO);
char *arg[2];
arg[0] = cmd2;
arg[1] = NULL;
dup(piped[0]);
close(piped[0]);
close(piped[1]);
execvp(cmd2,arg);
}
我只是想说清楚。问题不在插座或管道中,这就是为什么我只报告了主要部分根据我的理解,您想要的是下面的内容
if(fork() == 0)
{
//Process to compute cmd1
char *arg[2];
arg[0] = cmd1;
arg[1] = NULL;
dup2(piped[1],STDOUT_FILENO); //Redirect stdout to pipe's write end
dup2(piped[1],STDERR_FILENO); //Redirect stderr to pipe's write end
close(piped[0]);
close(piped[1]);
close(newsockfd);
execvp(cmd1,arg);
}
if(fork() == 0)
{
//Process to compute cmd2
char *arg[2];
arg[0] = cmd2;
arg[1] = NULL;
dup2(piped[0],STDIN_FILENO); //Redirect pipe's read end to stdin
dup2(newsockfd,STDOUT_FILENO); //Redirect stdout to socket
dup2(newsockfd,STDERR_FILENO); //Redirect stderr to socket
close(piped[0]);
close(piped[1]);
close(newsockfd);
execvp(cmd2,arg);
}
close(piped[0]);
close(piped[1]);
close(newsockfd);
为什么您希望从cmd1重定向任何内容?您没有对该子进程的输入或输出执行任何操作。这就是问题所在。如何调试代码,例如显示execvp(cmd1,arg)输出的printf;在第二个孩子身上?我认为这是正确的。我试过了,但在telnet控制台客户端没有显示任何内容。execvp(cmd2,arg);应具有execvp的输出(cmd1,arg);作为论据,但这段代码怎么可能呢?至于telnet部分,我无法用您当前的代码得出任何进一步的结论。也许你可以简单地写(newsockfd,“abc”,3)看看它是否出现在另一端。至于争论部分,也许我没有正确地理解你。您希望cmd1的输出(stdout&stderr)是cmd2的stdin还是cmd2的命令行参数?上面的代码将实现前者而不是后者。telnet客户端可以工作。我希望cmd1的输出是cmd2的命令行参数。我正在尝试在linux cmd1 | cmd2中实现普通管道命令。因此,第一个子级执行cmd1,然后第二个子级执行cmd2,cmd1的输出作为命令行参数。例如ls | sort。第一个子项执行Cmd1,然后输出字符串转到第二个子项,该子项使用第一个子项的字符串执行排序。您自相矛盾。命令行中的管道|将把左边cmd的stdout重定向到右边命令的stdin,就像我的代码所做的那样(与stderr不同)。也许您可以将cmd2更改为cat,看看它是否有效。对不起,我正在尽最大努力澄清。execvp(cmd2,arg)是如何执行的;了解其参数是execvp(cmd1,arg)的输出;在你的代码里?这就是我不能理解的。