У меня есть приложение Java, которое запускает приложение C ++ через API java.lang.Process, а затем пытается отправить ему команды через канал stdin:
process.getOutputStream().write("foo\n");
process.getOutputStream().flush();
На стороне C ++ работает цикл, который проверяет ввод в stdin и, если есть,
это читает это. К сожалению, проверка всегда возвращает 0, следовательно, она никогда не пытается прочитать. Если я уберу проверку, она внезапно начнет видеть команды и обрабатывать их. Это на Linux.
Код приложений C ++ для проверки и чтения из stdin:
fd_set fds;
FD_ZERO ( &fds );
FD_SET ( 0, &fds );
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 0;
if( select ( 1, &fds, 0, 0, &tv ) > 0 ) {
char buf[16384];
buf[16383] = '\0';
if ( fgets ( buf, sizeof ( buf ) - 1, stdin ) == 0 )
return;
}
Как я уже сказал, удаление условия if заставляет его работать, но, конечно, это не так приятно, поскольку цикл вокруг него также делает некоторые другие вещи. Кто-нибудь понял, что я здесь не так делаю?
Обновление:
Тем временем я смог воспроизвести проблему с двумя очень маленькими примерами приложений. Похоже, что проблема здесь связана с платформой Qt, как только я создаю экземпляр QCoreApplication, необходимый для этой инфраструктуры, тогда select () для stdin, похоже, больше не работает.