尝试读取的分段错误,直到在C中遇到标题

时间:2011-07-01 22:45:33

标签: c segmentation-fault

我是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]开始,因此很容易跟踪每个消息字段。试着向专家学习,谢谢。

1 个答案:

答案 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