создание канала от стандартного родительского процесса к стандартному дочернему процессу - PullRequest
0 голосов
/ 21 февраля 2011

Я пытаюсь передать stdin моего родительского процесса в дочерний процесс.

stdin -> parentprocess -> child_eingabe [1] -> child_eingabe [0] -> childprocess ->stdin

Моя маленькая программа работает таким образом, что я могу записать материал из моего родительского процесса в канал (с помощью команды 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 ]

2 голосов
/ 21 февраля 2011

Почему вы перенаправляете родительский стандарт на канал? Как я понимаю, это именно то, что вы хотите избежать. Удаление второго dup2 и close (0) должно оставить вашего родителя с stdin, который полностью отключен от канала.

РЕДАКТИРОВАТЬ: После прояснения вопроса - Хотите скопировать данные из родительского стандартного ввода в дочерний ввод.

Создайте дочерний канал, как вы, затем вручную прочитайте stdin в родительском и передайте данные ребенку с write() на child_eingabe[1]

0 голосов
/ 21 февраля 2011

Вам действительно нужен ввод, чтобы перейти к родительскому процессу?

Если нет, вы можете закрыть стандартный родительский элемент, после чего весь ввод поступает в дочерний процесс.

В противном случае самым простым способом должно быть то, что написал Эрик.

Другим способом (не уверенным, если это применимо к вашему делу), должно быть перенаправление стандартного ввода дочернего элемента и стандартного вывода родительского элемента в канал. Ваш родительский модуль читает входные данные и записывает их в стандартный вывод (дочерний ввод).

...