2015-05-25 2 views
6

Мне нужно открыть подпроцесс, используя popen, процесс будет постоянно запрашивать ввод пользователя ... Основной процесс должен отправить эти данные по каналу.Непрерывно записывайте в подпроцесс, используя popen в C++

Это моя первая попытка:

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 .:./* в команде не распространяется на недопустимый путь к классам. Я думаю, что это приведет к расширению до нескольких аргументов, если в текущем каталоге больше одного файла, а не в действительных элементах pathpath.

+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 

Так что я на самом деле подозревая, что проблема отсутствует \ п.

Смежные вопросы