Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将两个命令与fork、execvp连接起来,然后将输出重新定向到套接字_C_Sockets_Pipe_Fork_Exec - Fatal编程技术网

将两个命令与fork、execvp连接起来,然后将输出重新定向到套接字

将两个命令与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

我有两个命令cmd1和cmd2,我必须在子级中执行cmd1,将输出重定向到另一个子级,然后以cmd1的输出作为参数执行cmd2。然后我必须将输出重定向到与套接字连接的远程客户端(telnet)。我无法找出问题所在,但我的解决方案没有将cmd1输出重定向到cmd2

    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)的输出;在你的代码里?这就是我不能理解的。