精英盒子 -> 程序设计 -> windows管道——小型C++类 [打印本页]

outman 2011-08-19 23:47

windows管道——小型C++类




最近因为种种原因要用到管道,所以就研究了下windows的管道功能,结果一看到一大堆参数就头晕-、-看那短短的200来字教程看了半小时 最后发觉原来照抄就可以了-、-
于是为了便于以后我的使用,就写了个类废话不多说 上代码
http://down.qiannao.com/space/file/gaotongxiao/share/pipe.rar/.page

没错,这是个头文件~在这个头文件里,我定义了两个常量:my_cin和my_cout
下面是每个函数的用法:构造函数 pipe(char*) 可以设置欲运行的文件路径,如果是子进程使用pipe的话必须填入son
void setfile(char*) 可以设置欲运行的文件路径const char* get() 获取子进程(或父进程)在管道中写入的数据,返回一个字符串
void in(bool,HANDLE) 设置往子进程的输入方式,bool为0时恢复默认,为1时设置输入通过HANDLE读取,可以使用my_cin,意为输入通过当前输入管道输入void out(bool,HANDLE) 同上,更改输出方式,可以使用my_cout
bool send(const char* str) 向对应进程的输入管道发送字符串bool run() 设置完毕,运行之
来一个简单点的实例:
  1. //父进程
    #include "pipe"#include <iostream>
    int main(){pipe a("d:\\a.exe");
    //或者可以这样a.setfile("d:\\a.exe");
    if(!a.run()){std::cout<<"error!";exit(1);}//运行d:\a.exe
    //注意这里用\\ 因为一个\是转义符while(1){
    std::cout<<a.get();//a.exe所有标准输出都会写入管道,由类pipe读出}
    return 0;}
  1. //子进程a.exe
    #include <iostream>int main(){
    std::cout<<"hello world!";return 0;
    }


结果当然是这样的

最后一个例子咯-、-
  1. //父进程[
    #include "pipe"#include <iostream>
    using namespace std;int main(){
    pipe a("a.exe");a.run();
    a.send("hello[color=#ff0000]\n[/color]");//注意while(1)cout<<a.get();
    return 0;}
  1. //子进程
    #include "pipe"
    #include <iostream>using namespace std;
    int main(){pipe a("son");
    char b[10];cin>>b;
    a.send(b);return 0;
    }

结果同上
看得出来,假如父进程中输入用默认管道,而子进程中使用cin的话,就必须在发送的字符串后加上\n才能让cin接收到数据。

jybox 2011-08-19 23:54
真的是好东西,估计不久后我就会用到
要是QT里没有封装管道相关的东西的话,就用你这个了

jybox 2011-08-19 23:56
你接下来实现一下双向管道吧
就是a的标准输出重定向到b的标准输入
b的标准输入重定向到a的标准输入

outman 2011-08-20 08:43
对 我昨晚睡觉的时候就想到这个问题…… 然后我就失眠了

abreto 2011-08-20 15:57
管道是这样的?

outman 2011-08-24 07:28
待本人顶起 今天编辑了下

outman 2012-10-11 15:48
居然都一年了……(我是在首页见到有人回复才进来的 貌似是广告号被JY删了)




Powered by phpwind v8.7 Code ©2003-2011 phpwind
Time 0.044514 second(s),query:5 Gzip enabled