2017-06-29 65 views
0

我有两个命令cmd1和cmd2,我必须在子节点中执行cmd1,将输出重定向到另一个子节点,然后使用cmd1的输出执行cmd2作为论据。然后,我必须将输出重定向到与套接字连接的远程客户端(telnet)。我无法弄清楚问题,但我的解决方案不会将cmd1输出重定向到cmd2。使用fork,execvp然后重新输出到套接字的两个命令的管道

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); 
    } 

只是要清楚。这个问题是不是在插座inizilization或管道,这就是为什么我只报告主要部分

+0

为什么你会想到什么东西从CMD1重定向?您不会对该子进程的输入或输出做任何事情。 –

+0

这就是问题所在。如何调试代码,例如显示execvp(cmd1,arg)输出的printf;在第二个孩子? –

回答

0

根据我的了解,你想要什么会像下面

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); 
+0

我认为这是正确的。我试过了,但它并没有在telnet控制台客户端中显示任何内容。 execvp(cmd2,arg);应该有execvp(cmd1,arg)的输出;作为参数,但如何可能与该代码? –

+0

至于telnet部分,我无法用您当前的代码得出任何进一步的结论。也许你可以简单地写(newsockfd,“abc”,3)来看看它是否出现在另一端。至于说法部分,也许我没有正确理解你。你希望cmd1的输出(stdout&stderr)是cmd2的stdin或cmd2的命令行参数吗?上面的代码将实现前者而不是后者。 –

+0

Telnet客户端工作。我希望cmd1的输出是cmd2的命令行参数。我试图在linux cmd1 | cmd2中实现普通的管道命令。因此,第一个孩子执行cmd1,然后第二个孩子执行cmd2,输出cmd1作为命令行参数。例如ls | sort。第一个孩子执行Cmd1,然后输出字符串转到第二个孩子,它执行与第一个孩子的字符串排序 –

相关问题