用stdio和C ++ / Python管道EOF问题

时间:2010-03-14 20:43:32

标签: c++ python pipe stdin iostream

我在python进程和C ++程序之间的通信管道中遇到了EOF和stdio的一些问题。我不知道我做错了什么。当我在程序中看到一个EOF时,我清除了stdin,下一轮我试着读一个新的行。问题是:由于某种原因,getline函数立即(从第二次运行,第一次运行就像预期的那样)返回一个EOF,而不是等待来自python进程的新输入......任何想法?

好的这是代码:

#include <string>
#include <iostream>
#include <iomanip>
#include <limits>

using namespace std;

int main(int argc, char **argv) {
    for (;;) {
        string buf;
        if (getline(cin,buf)) {
            if (buf=="q") break;
            /*****///do some stuff with input //my actual filter program
            cout<<buf;
            /*****/
        } else {
            if ((cin.rdstate() & istream::eofbit)!=0)cout<<"eofbit"<<endl;
            if ((cin.rdstate() & istream::failbit)!=0)cout<<"failbit"<<endl;
            if ((cin.rdstate() & istream::badbit)!=0)cout<<"badbit"<<endl;
            if ((cin.rdstate() & istream::goodbit)!=0)cout<<"goodbit"<<endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max());

            //break;//I am not using break, because I
                    //want more input when the parent
                    //process puts data into stdin;
        }
    }

    return 0;
}

并在python中:

from subprocess import Popen, PIPE
import os
from time import sleep

proc=Popen(os.getcwd()+"/Pipingtest",stdout=PIPE,stdin=PIPE,stderr=PIPE);

while(1):
  sleep(0.5)

  print proc.communicate("1 1 1")
  print "running"

1 个答案:

答案 0 :(得分:1)

python中的

communicate是一次性功能。它将给定的输入发送到进程,关闭输入流,并读取输出流,等待进程终止。

在“通信”之后,您无法使用相同的流程“重新启动”管道。

相反,在管道的另一侧,当您阅读EOF时,没有更多数据可供阅读。任何阅读尝试都会立即返回EOF; python关闭了管道。

如果要继续使用同一个管道进行通信,则需要使用子进程“stdinstdout成员而不是communicate(但要注意死锁的可能性)并使用除结束之外的其他内容来表示C ++方应该进行另一批“处理”。