为什么从Mac OSX管道(2)读取(2)将0x7F插入字符串?

时间:2014-09-25 22:24:43

标签: c++ macos

我正在打开一个子进程的管道,并通过该管道读回其标准。

如果我只是做一次读取,就像我在原型中所做的那样,它正确地返回字符串(下面的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相关的错误吗?

2 个答案:

答案 0 :(得分:1)

我建议你的字符串没有正确终止。

您可以执行buffer[count] = 0;(但请确保您的缓冲区中有一个元素比您正在阅读的元素多一个,因此需要read(pipe, buffer, sizeof(buffer)-1)

或者使用append大小:

output.append(buffer, count);

0x7f可能只是输入之外的一些随机垃圾 - 你很幸运它是一个字符,而不是半打或一兆字节的“额外”。 [或者它不只是读取内存的结尾并崩溃]

答案 1 :(得分:0)

当然没有。

通过附加整个缓冲区,而不是第一个&#39;它的字节。

注意你的循环条件错误,它应该是&gt; 0