2015-05-25 30 views
6

我需要使用popen打开子进程,进程将不断询问用户输入...主进程需要通过管道发送该数据。在C++中使用popen连续写入子进程

这是我第一次尝试:

FILE *in; 
char buff[1024]; 

if(!(in = popen("cd FIX/fix2/src; java -cp .:./* com.fix.bot", "w"))){ 
    return 1; 
} 

while(1){ 
    char buffer[] = { 'x' }; 
    fwrite(buffer, sizeof(char), sizeof(buffer), in); 

    cout << "Wrote!" << endl; 
    usleep(1000000); 
} 

但是不发送数据!我需要用pclose()关闭管道,以便将数据写入进程。如何确保无需每次关闭管道都能写入数据?

+1

有没有可能您的应用程序正在查找以\ n结尾的输入?因为你现在没有发送LF ... –

+0

不要忘记检查'fwrite()的结果'我认为它不能保证写出你请求的所有东西。通常它会,但你需要验证。 –

回答

1

您需要拨打fflush(in)以确保缓冲数据实际写入流中。

此外,请检查命令中的java -cp .:./*未扩展为无效的类路径。如果当前目录中有多个文件,并且不是实际的类路径条目,我认为这将最终扩展为多个参数。

+1

它仍然没有冲洗...我仍然需要使用fflush()关闭管道。可能是什么问题呢? –

+0

我更新了答案,我认为也可能是类路径设置错误。尝试执行'echo java -cp。:./*'来查看它是否合法。 – Misandrist

+1

我会确保检查命令以打开java进程...但是到目前为止它似乎工作正常。当我关闭它时,数据被写入管道并且Java过程相应地响应。但是我需要确保数据被刷新...... –

0

这个工作对我来说:

#include <stdio.h> 
#include <unistd.h> 
#include <iostream> 

int main(int argc, char ** argv) { 
    FILE *in; 
    char buff[1024]; 

    if(!(in = popen("./2.sh", "w"))){ 
     return 1; 
    } 

    while(1) { 
     char buffer[] = "xx\n"; 
     fwrite(buffer, sizeof(char), sizeof(buffer), in); 
     fflush(in); 
     std::cout << "Wrote!" << std::endl; 
     usleep(1000000); 
    } 
} 

其中2.sh是:

#!/bin/sh 

read INP 
echo 'read: ' $INP 

真的让我很怀疑,问题是缺少\ n。