Read()卡在尝试读取文件上

时间:2018-11-25 16:14:17

标签: c file io

我有一个接收服务器状态的检查点文件。此状态表示通过我的网络的序列化命令。

我正在尝试读取文件,但是它卡在了read while循环中。

我的阅读功能:

struct message_t *pmanager_readop(int fd){
    if (fd < 0) return NULL;

    // Variables
    char *buffer = NULL;
    int result, msg_size;
    struct message_t *msg;

    // Check if file has data
    lseek (fd, 0, SEEK_END);
    int size_ckp = lseek(fd, 0, SEEK_CUR);

    if (size_ckp <= 0)
        return NULL;

    // Read message size
    result = read_all(fd, (char *) &msg_size, 4);
    if (result < 0) {
        return NULL;
    }
    msg_size = ntohl(msg_size);
    // ............

我的read_all()函数:

int read_all(int sock, char *buf, int len){
    int bufsize = len;
    while(len > 0){
        int res = read(sock,buf,len);

        if(res < 0){
            if (errno == EINTR) continue;
            return res;
        }
        buf += res;
        len -= res;
    }
    return bufsize;
}

我使用相同的功能从服务器/客户端连接中读取具有相同序列化和格式但具有套接字描述符的数据,并且它运行良好。

1 个答案:

答案 0 :(得分:1)

您应该处理read()返回0的情况,告诉您如果从套接字描述符中读取则另一端关闭连接,或者如果从套接字描述符中读取则遇到EOF文件描述符。