libuv:bad address in system call argument

今天在使用libuv時出現了EFAULT錯誤,寫此文章作爲記錄。

 

EFAULT:

引用:https://www.cnblogs.com/yxwkf/p/5399164.html

It happen if the memory address of some argument passed to sendto (or more generally to any system call) is invalid. Think of it as a sort of SIGSEGV in kernel land regarding your syscall. For instance, if you pass a null or invalid buffer pointer (for reading, writing, sending, recieving...)。說明在對套接字上調用某些函數的時候傳入了空指針等非法參數,的確如此。

 

libuv

使用的是libuv自帶的demo,tcp-echo-server

void echo_read(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
    if (nread > 0) {
        write_req_t *req = (write_req_t*) malloc(sizeof(write_req_t));
        req->buf = uv_buf_init(buf->base, nread);
        uv_write((uv_write_t*) req, client, &req->buf, 1, echo_write);
        return;
    }
    if (nread < 0) {
        if (nread != UV_EOF)
            fprintf(stderr, "Read error %s\n", uv_err_name(nread));
        uv_close((uv_handle_t*) client, on_close);
    }

    free(buf->base);
}

該段代碼的意圖是接收到客戶端的消息後,再發送相同的數據給客戶端。

爲了驗證libuv發送大量數據時,是如何運行的,我直接將代碼改成了如下,然後就出現了EFAULT錯誤

void echo_read(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
    if (nread > 0) {
        write_req_t *req = (write_req_t*) malloc(sizeof(write_req_t));
        req->buf = uv_buf_init(req->base, 10240*200);
        uv_write((uv_write_t*) req, client, &req->buf, 1, echo_write);
        return;
    }
    if (nread < 0) {
        if (nread != UV_EOF)
            fprintf(stderr, "Read error %s\n", uv_err_name(nread));
        uv_close((uv_handle_t*) client, on_close);
    }

    free(buf->base);
}

EFAULT錯誤就是因爲操作了不該操作的內存,而仔細觀察uv_buf_init之後,發現該函數並沒有申請空間,也就是並沒有我之前想象的會有10240*200的大小,所以出現了錯誤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章