我正在尝试在与主线程不同的线程中从标准输入读取一些数据。主线程应该能够通过写入标准输入与这个等待线程进行通信,但是当我运行测试代码(包括在下面)时,除了消息(我的测试代码中的'do_some_work')直接打印在终端上而不是从等待线程输出。
我尝试了 SO 上列出的几个解决方案,但没有成功。我的代码模仿了以下 SO question 的解决方案之一,它本身工作得很好,但是当与我的 read_stdin_thread 结合使用时,它就不行了。
#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;
}
说明如何写入 stdin 的代码片段将由 threadReadStdin 读取,这将非常有帮助。
提前非常感谢!
编辑:
我在这里忘记提到的一件事是 readStdin() 中的代码是第三方代码,并且发生的任何类型的通信都必须符合其条款。
此外,我很容易将 std::cin 和 std::cout 重定向到 fstream 或 stringstream。问题是,当我写入重定向的 cin 缓冲区时,读取线程上并没有真正出现。
编辑2:
这是一个单进程应用程序,不能选择生成。