使用两个不同的管道c ++,使用相同的进程读写

时间:2017-02-20 15:36:00

标签: c++ subprocess pipe fork

我正在尝试创建一个调用某个程序或进程的子代。父级通过两个管道从子级写入和读取一些数据。我的代码编译并运行,但输入中没有文本。我究竟做错了什么?我没有正确关闭管道,写管道或正确输出数据吗?

#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;
}

前卫的输出:

  

echo&lt;&lt; /家庭/ PI / 1

我发现问题write()返回-1。 但我不知道为什么?

1 个答案:

答案 0 :(得分:0)

  

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

您正在写入管道的读取端。

除此之外,您的应用程序受到死锁的威胁。如果你试图写这么多管道缓冲区填满,并且孩子产生如此多的数据,管道缓冲区也填满了怎么办?然后两个进程都在等待另一个进程耗尽缓冲区,但它们都被阻塞在write