我是C的新手,所以请原谅这个问题的简单性。我正在尝试编写一个函数(作为一个lib,因此它必须是健壮的),它不断读取一个字节(编辑:来自串行端口),直到遇到一个头起始字节。如果找到它,它将读取头部和有效负载的其余部分并将其存储在结构中。我的代码的开头看起来像这样(将包括一些伪代码):
soh_read = 0;
bytes_read = 0;
bytes_left = 1;
do{
n = read(fd, buf + bytes_read, bytes_left);
if(n < 0){
if(errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR){
return -1;
}
}else{
bytes_read += n;
if(!soh_read){
if(buf[0] != SOH){
bytes_read = 0;
continue;
}
}
soh_read = 1;
//read header ...
//read payload ...
}while(timeout is not reached);
我假设如果没有遇到SOH,我可以将bytes_read重置为0,并尝试再次读取buf [0]位置,覆盖之前读取的垃圾。但这似乎是一个缓冲区溢出的情况,为什么我得到一个分段错误?为什么这不起作用?如果是这样,最好的方法是什么?我想从buf [0]开始,因此很容易跟踪每个消息字段。试着向专家学习,谢谢。
答案 0 :(得分:4)
您遗漏了一些对于诊断代码问题至关重要的信息。最重要的一点是(可能)您的SOH是否可能在文件中的后期发生,而不是您在buf
中允许的空间。
然而,我认为我会做的事情有所不同:因为你显然不需要(甚至不关心)SOH之前的数据,为什么不把所有数据都读成一个字符,在每次迭代时覆盖前一个值,并且只有在遇到SOH后才能保存多个数据字节,因此您实际上可以使用它。
do {
read(fd, buf, 1);
if (n<0 && errno != EWOULDBLOCK && /* ... */)
return -1;
} while (buf[0] != SOH and !timeout_reached);
// read the header here