今天在使用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的大小,所以出現了錯誤