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的大小,所以出现了错误

https://gitee.com/Qyerp/OpenHiMini OpenHiMini 说明: 对应开发版地址: ├───────────── https://item.taobao.com/item.htm?ft=t&id=619546119474 ├───────────── 购买开发板的可以提供整套解决方案支持 ├───────────── 目前支持 hi3516ev300+IMX335 已实现功能 ├────────────── http-flv ├────────────── rtmp推流 ├────────────── http抓拍 ├────────────── http服务器 视频测试地址 ├──────────────http://192.168.1.230:10100/flv.html HTTPAPI ├──────────────HTTP抓拍 ├──────────────水平、垂直镜像 工程目录 ├──────────────HISDK 海思SDK库文件 ├──────────────jsoncpp json解析库 ├──────────────lib 一些开源项目的库文件 ├──────────────libcurl http客户端工具 ├──────────────libjpeg jpg编码,解码库 ├──────────────librtmp rtmp推流,拉流库 ├──────────────libuv 网络库 ├──────────────MiniBase 基础库 ├──────────────mp4v2 mp4(h264,aac)封装 ├──────────────opus 音频编码 ├──────────────OpenHiMini 主工程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值