2017-02-20 35 views
0

Я пытаюсь создать дочерний элемент, который вызывает некоторую программу или процесс. Родители записывают и считывают некоторые данные из дочернего элемента через два канала. Мой код компилируется и запускается, но на входе нет текста. Что я делаю не так? Правильно ли я закрываю трубы, правильно ли записываю трубы или выдавая данные?читать и писать с помощью одного и того же процесса, используя две разные трубы C++

#include <iostream> 
#include <errno.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <string.h> 

int main(){ 
    int pipedes1[2],pipedes2[2]; 
    char buff[256]; 
    string text = "Hello"; 
    pid_t pid; 
    pipe(pipedes1); 
    pipe(pipedes2); 
    pid = fork(); 
    if(pid > 0){ 

     close(pipedes1[1]); 
     close(pipedes2[0]); 

     dup2(pipedes2[1], STDOUT_FILENO); 
     dup2(pipedes1[0], STDIN_FILENO); 

     execve("/home/pi/Test", NULL, NULL); 

    } else { 

     close(pipedes1[1]); 
     close(pipedes2[1]); 

     write(pipedes1[0], text.c_str(), text.length()); 
     while((len = read(pipedes2[0], buff, 256)) != 0){ 
      cout << buff << endl; 
     } 
     close(pipedes2[0]); 
     close(pipedes1[0]); 
    } 
    return 0; 
} 

И есть моя программа "chield":

int main(){ 
    string str; 
    cin >> str; 
    str = "echo " + str + " >> /home/pi/1"; 
    cout << str << endl; 
    return 0; 
} 

Выход прог:

эхо < </главная/пи/1

Im найдены проблема write() возвращает -1. Но я не знаю почему?

ответ

0

write(pipedes1[0], text.c_str(), text.length());

Вы пишете читающий конце трубы.

За исключением этого, ваше приложение находится под угрозой с помощью тупиковой ситуации. Что делать, если вы пытаетесь написать так много, что буфер буфера заполняется, и ребенок производит так много данных, что заполняет его буфер буфера? Затем оба процесса ждут другого, чтобы слить буфер, но каждый из них заблокирован в write!

+0

Да, теперь писать, кажется, все в порядке. Но теперь моя прога перехватила цикл read(). Похоже, что мой чарт не поймал ни одного stdin и не отправил никаких выходов. –

 Смежные вопросы

  • Нет связанных вопросов^_^