【问题标题】:creating a pipe from a parent process stdin to a childprocess stdin创建从父进程标准输入到子进程标准输入的管道
【发布时间】:2011-02-21 12:41:30
【问题描述】:

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

stdin --> 父进程 --> child_eingabe[1] --> child_eingabe[0] --> 子进程 --> stdin

我的小程序以这种方式工作,我可以将父进程中的内容写入管道(使用 write() 命令),并通过标准输入到达我的孩子。不起作用的是,父级的标准输入直接写入管道中。这是否按我的计划工作?

#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 不会像我预期的那样。

【问题讨论】:

    标签: c++ c linux pipe


    【解决方案1】:

    为什么要将父级标准输入重定向到管道?据我了解,这正是您要避免的。删除第二个 dup2 和 close(0) 应该让您的父级拥有一个与管道完全断开连接的标准输入。

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

    像你一样创建子管道,然后手动在父管道中读取标准输入,并在child_eingabe[1] 上使用write() 将数据传递给子管道

    【讨论】:

    • 我尝试使用 Pipes 将 PARENT 的标准输入重定向/复制到 CHILD 的标准输入。
    • 如果你想保留孩子的现有标准输入,根本不要做任何重定向。
    • 我尝试将父级的标准输入传输到子级。
    • 这对我来说没有意义,抱歉。您是要“从父母标准输入获取数据并手动将其传递给孩子”还是“让孩子接管父母标准输入”或“让孩子共享父母标准输入”?
    • 好的,现在我想我明白你在问什么了。您需要手动复制从父母标准输入读取的数据,因此请使用我在答案中所说的(不要对父母标准输入做任何事情),然后手动将其写入()到子管道的父母端。
    【解决方案2】:

    你真的需要输入去父进程吗?

    如果没有,您可以关闭父级的标准输入,然后所有输入都转到子进程。

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

    其他方式(如果适用于您的情况则不适用),应该将孩子的标准输入和父母的标准输出重定向到管道。您的父母读取输入并将其写入它的标准输出(孩子的输入)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 2013-07-16
      • 1970-01-01
      • 2012-03-13
      • 2019-03-17
      • 1970-01-01
      • 2017-06-25
      相关资源
      最近更新 更多