我正在为使用本机主机消息传递的Chrome编写扩展程序。目标是在应用模式下运行时,在操作系统默认浏览器中启用Chrome打开链接。 Chrome通过管道实现本机主机消息传递到本机应用程序的stdin和stdout。这一切都很好,我已经扩展了与本机应用程序的对话。我遇到的问题是前4个字节的数据包含以下字符串的长度,为了我的目的,它总是包含空字符。示例strace如下所示。处理这个问题的最佳方法是什么?我想使用像cin或getline这样的东西,这会阻止程序,直到收到输入为止。
Process 27964 attached
read(0, "~\0\0\0\"http://stackoverflow.com/qu"..., 4096) = 130
read(0,
这是当前的C ++代码。我尝试过使用cin.get和fgets的变体,但是他们不会等待输入,并且在循环运行之后Chrome会杀死程序。
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
for(;;) {
string message;
cin >> message;
if(!message.length()) break;
string cmd(string("xdg-open ") + message);
system(cmd.c_str());
}
return 0;
}
答案 0 :(得分:1)
据我所知here,长度应该是本机字节顺序,因此编译器使用相同的CPU结构时具有相同的字节顺序:
每个消息都使用JSON,UTF-8编码序列化,并且先于 以原生字节顺序的32位消息长度。
这意味着您可以先读取长度:
uint32_t len;
while (cin.read(reinterpret_cast<char*>(&len), sizeof (len))) // process the messages
{
// you know the number of bytes in the message: just read them
string msg (len, ' '); // string filled with blanks
if (!cin.read(&msg[0], len) )
/* process unexpected error of missing bytes */;
else /* process the message normally */
}