2015-05-25 35 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。