Я пытаюсь прочитать некоторые данные из stdin в отдельном потоке из основного потока.Основной поток должен иметь возможность общаться с этим ожидающим потоком, записывая в stdin, но когда я запускаю тестовый код (включенный ниже), ничего не происходит, за исключением того, что сообщение ('do_some_work' в моем тестовом коде) печатается непосредственно на терминале вместовывод из ожидающего потока.
Я пробовал пару решений, перечисленных в SO, но безуспешно.Мой код имитирует одно из решений из следующего SO вопроса, и он прекрасно работает сам по себе, но в сочетании с моим read_stdin_thread это не так.
Возможно ли записать данные в собственный stdin в Linux
#include <unistd.h>
#include <string>
#include <iostream>
#include <sstream>
#include <thread>
bool terminate_read = true;
void readStdin() {
static const int INPUT_BUF_SIZE = 1024;
char buf[INPUT_BUF_SIZE];
while (terminate_read) {
fd_set readfds;
struct timeval tv;
int data;
FD_ZERO(&readfds);
FD_SET(STDIN_FILENO, &readfds);
tv.tv_sec=2;
tv.tv_usec=0;
int ret = select(16, &readfds, 0, 0, &tv);
if (ret == 0) {
continue;
} else if (ret == -1) {
perror("select");
continue;
}
data=FD_ISSET(STDIN_FILENO, &readfds);
if (data>0) {
int bytes = read(STDIN_FILENO,buf,INPUT_BUF_SIZE);
if (bytes == -1) {
perror("input poll: read");
continue;
}
if (bytes) {
std::cout << "Execute: " << buf << std::endl;
if (strncmp(buf, "quit", 4)==0) {
std::cout << "quitting reading from stdin." << std::endl;
break;
}
else {
continue;
}
}
}
}
}
int main() {
std::thread threadReadStdin([] () {
readStdin();
});
usleep(1000000);
std::stringstream msg;
msg << "do_some_work" << std::endl;
auto s = msg.str();
write(STDIN_FILENO, s.c_str(), s.size());
usleep(1000000);
terminate_read = false;
threadReadStdin.join();
return 0;
}
Фрагмент кода, иллюстрирующий, как писать на стандартный ввод, который, в свою очередь, читается threadReadStdin, был бы чрезвычайно полезен.
Заранее большое спасибо!
Редактировать:
Одна вещь, которую я забыл упомянуть, это то, что код в readStdin () - это сторонний код, и любой вид связи, который происходит, должен быть на его условиях.
Также ядовольно легко перенаправить std :: cin и std :: cout в fstream или stringstream.Проблема в том, что когда я пишу в перенаправленный буфер cin, в потоке чтения на самом деле ничего не появляется.
Edit2:
Это приложение с одним процессом, и порождение не является опцией.