我正在打开一个子进程的管道,并通过该管道读回其标准。
如果我只是做一次读取,就像我在原型中所做的那样,它正确地返回字符串(下面的BEFORE案例)。
如果我循环以便读取所有可能大小的输出,我会在结尾处获得字符串加上一个终止的0x7F(ASCII DEL),这会搞砸我的测试。
仅在运行Mac OSX 10.9.4,Clang 3.4的笔记本电脑上出现故障。
它在FreeBSD 10.0,Clang 3.3上正常工作(没有0x7F)。
代码之前:
char buffer[1024];
read(pipeFd, buffer, sizeof(buffer));
string output = buffer;
失败的代码:
char buffer[1024];
ssize_t count;
string output;
while ((count = read(pipe, buffer, sizeof(buffer))) != 0) {
if (count < 0) {
return false;
}
output.append(buffer);
}
return true;
我做错了什么?这是与Mac相关的错误吗?
答案 0 :(得分:1)
我建议你的字符串没有正确终止。
您可以执行buffer[count] = 0;
(但请确保您的缓冲区中有一个元素比您正在阅读的元素多一个,因此需要read(pipe, buffer, sizeof(buffer)-1)
。
或者使用append
大小:
output.append(buffer, count);
0x7f可能只是输入之外的一些随机垃圾 - 你很幸运它是一个字符,而不是半打或一兆字节的“额外”。 [或者它不只是读取内存的结尾并崩溃]
答案 1 :(得分:0)
当然没有。
通过附加整个缓冲区,而不是第一个&#39;它的字节。
注意你的循环条件错误,它应该是&gt; 0