从父进程stdin到childprocess stdin创建管道

时间:2011-02-21 12:41:30

标签: c++ c linux pipe

我尝试将父进程的标准输入转移到子进程。

stdin - > parentprocess - > child_eingabe [1] - > child_eingabe [0] - >子进程 - >标准输入

我的小程序以这种方式工作,我可以将父进程中的东西写入管道(使用write()命令),并通过stdin到达我的孩子。什么不行,是父母的标准输入直接写入管道。这有效吗?

#include <iostream>
#include <string>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main(int argc, char *argv[])
{
        // string to the client
        string sClient = "/tmp/myecho";

        int child_eingabe[2];

        cout << "Creating pipes " << endl;

        if(pipe(child_eingabe) < 0) {
                cout << " Error in pipe " << endl;
        } 

        // forking now
        pid_t pid;

        cout << "Forking process" << endl;

        if((pid = fork()) == 0) {


                close(child_eingabe[1]);

                int fid = -1;
                if(fid=dup2(child_eingabe[0], 0) < 0)
                        cout << "Could not redirect STDIN" << endl;

                close(child_eingabe[0]);

                int result = execve(sClient.c_str(),0,0);
                cout << "something went wrong while starting client" << endl;

                if (result != 0) {
                        cout << "Could not start" << endl;
                }
                exit(0);
        }
        close(child_eingabe[0]);

//      if(dup2(0,child_eingabe[1]) < 0)
        if(dup2(child_eingabe[1],0) < 0)
                cout << "Could not redirect STDIN" << endl;

        close(0);
        while(1)
        {
                sleep(1);
        }
        return 0;
}

如果我看到一切正确,那么父部分中的第二个dup2并不是我所期望的。

2 个答案:

答案 0 :(得分:2)

为什么要将父stdin重定向到管道?据我了解,这正是你想要避免的。删除第二个dup2并关闭(0)应该为您的父项提供一个与管道完全断开连接的标准输入。

编辑:澄清问题后 - 想要将数据从父stdin复制到子stdin。

像你一样创建子管道,然后手动读取父级中的stdin,并将数据传递给write()child_eingabe[1]的孩子

答案 1 :(得分:0)

您确实需要输入转到父进程吗?

如果没有,您可以关闭父项的stdin,而不是所有输入都转到子进程。

否则,最简单的方法应该是Erik所写的。

其他方式(如果它适用于你的情况,不是shure),应该将孩子的stdin和父母的stdout重定向到管道。你的父母读取输入并将其写入stdout(孩子的输入)。