C++

2015-05-25 23 views
6

'da popen kullanarak alt işlemlere sürekli olarak yazmak Popen kullanarak bir alt işlem açmam gerekiyor, süreç sürekli olarak kullanıcı girişi istiyor ... Ana işlemin bu verileri boruya göndermesi gerekiyor.C++

Bu benim ilk girişimi: Veri gönderilmez Ancak

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

! Boruyu pclose() ile kapatmam gerekiyor, böylece veriler işleme yazılıyor. Boruyu her seferinde kapatmaya gerek kalmadan verileri nasıl yazabilirim?

+1

Uygulamanızın \ n? Şu anda bir LF göndermediğinden ... –

+0

'fwrite() 'nin sonucunu kontrol etmeyi unutma. İstediğin herşeyi yazmayı garanti edeceğini sanmıyorum. Genellikle yapar ama doğrulamak gerekir. –

cevap

1

Tamponlanmış verilerin aslında akışa yazıldığından emin olmak için fflush(in) numaralı telefonu aramak isteyeceksiniz. Ayrıca, java -cp .:./* numaralı komutun, geçersiz bir sınıf yoluna genişletilmediğini de kontrol edin. Geçerli dizinde birden fazla dosya varsa ve gerçek sınıf yolu girişleri yoksa, birkaç argümana genişler.

+1

Hala çalışmıyor ... Fflush() ile bile boruyu kapatmaya ihtiyacım var. Sorun ne olabilir? –

+0

Cevabı güncelledim ve sanırım bu sınıf yolu yanlış ayarlanmış olabilir. Yasal göründüğünü görmek için echo java-cp.: ./* 'yu deneyin. – Misandrist

+1

java işlemini açmak için komutu kontrol ettiğinizden emin olacağım ... Ama şimdiye kadar iyi çalışıyor gibi görünüyor. Verileri kapattığımda boruya yazılır ve Java süreci buna göre yanıt verir. Ama veriler temizlendiğinden emin olmalıyım .... –

0

Bu benim için çalışıyor: 2.sh

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

olduğu:

#!/bin/sh 

read INP 
echo 'read: ' $INP 

yüzden gerçekten sorun \ n eksik şüphelenen.