Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ksocket导致内存泄漏_C_Kernel Module_Kernel - Fatal编程技术网

使用ksocket导致内存泄漏

使用ksocket导致内存泄漏,c,kernel-module,kernel,C,Kernel Module,Kernel,我编写了一个简单的内核模块,其中包括以下ksocket连接接受代码: .....(some ksocket initiation) while( on_service ) { sockfd_c = kaccept(sockfd_s, (struct sockaddr *)&addr_cli, &addr_len); kclose(sockfd_c); } 并编写一个简单的客户端连接到此套接字服务器。 在控制台中,我发现当我持续运行客户机连接时,通过“free”

我编写了一个简单的内核模块,其中包括以下ksocket连接接受代码:

.....(some ksocket initiation)

while( on_service )
{
    sockfd_c = kaccept(sockfd_s, (struct sockaddr *)&addr_cli, &addr_len);
    kclose(sockfd_c);
}
并编写一个简单的客户端连接到此套接字服务器。 在控制台中,我发现当我持续运行客户机连接时,通过“free”命令,内存使用量正在增加

kaccept()和kclose()的函数如下所示

int kclose(ksocket_t sockfd)                                                                                                                                                                                     
{
    struct socket *sk;
    int ret;

    sk = (struct socket *)sockfd;
    ret = sk->ops->release(sk);

    if (sk)
    {   
        sock_release(sk);
    }   

    return ret;
}

ksocket_t kaccept(ksocket_t socket, struct sockaddr *address, int *address_len)
{
    struct socket *sk;
    struct socket *new_sk = NULL;
    int ret;

    sk = (struct socket *)socket;

    sxg_debug("family = %d, type = %d, protocol = %d\n",
                sk->sk->sk_family, sk->type, sk->sk->sk_protocol);
    //new_sk = sock_alloc();
    //sock_alloc() is not exported, so i use sock_create() instead
    ret = sock_create(sk->sk->sk_family, sk->type, sk->sk->sk_protocol, &new_sk);
    if (ret < 0)
        return NULL;
    if (!new_sk)
        return NULL;

    new_sk->type = sk->type;
    new_sk->ops = sk->ops;

    ret = sk->ops->accept(sk, new_sk, 0 /*sk->file->f_flags*/);
    if (ret < 0)
        goto error_kaccept;

    if (address)
    {
        ret = new_sk->ops->getname(new_sk, address, address_len, 2);
        if (ret < 0)
            goto error_kaccept;
    }

    return new_sk;

error_kaccept:
    sock_release(new_sk);
    return NULL;
}
int-kclose(ksocket\t sockfd)
{
结构套接字*sk;
int ret;
sk=(结构套接字*)sockfd;
ret=sk->ops->release(sk);
如果(sk)
{   
袜子释放(sk);
}   
返回ret;
}
ksocket\u t kaccept(ksocket\u t socket,结构sockaddr*地址,int*地址)
{
结构套接字*sk;
结构套接字*new_sk=NULL;
int ret;
sk=(结构套接字*)套接字;
sxg_调试(“系列=%d,类型=%d,协议=%d\n”,
sk->sk->sk\u系列,sk->type,sk->sk->sk\u协议);
//new_sk=sock_alloc();
//sock_alloc()未导出,因此我使用sock_create()代替
ret=sock\u create(sk->sk->sk\u系列,sk->type,sk->sk->sk\u协议和新sk);
如果(ret<0)
返回NULL;
如果(!新建)
返回NULL;
新建sk->type=sk->type;
新建sk->ops=sk->ops;
ret=sk->ops->accept(sk,new_-sk,0/*sk->file->f_-flags*/);
如果(ret<0)
转到错误_kaaccept;
如果(地址)
{
ret=new-sk->ops->getname(new-sk,address,address-len,2);
如果(ret<0)
转到错误_kaaccept;
}
返回新任务;
错误接受:
袜子发布(新的);
返回NULL;
}

有人知道内存泄漏的原因/方式吗?

使用
valgrind
查找内存泄漏

作为


我的内核版本是3.2,我正在尝试编写一个内核套接字服务器。 经过几天的战斗,我有以下发现

我使用用户sock_create()创建一个套接字服务器,然后通过侦听和接受连接

sockfd_srv = sock_create(...)
...
while(1) {
    sockfd_srv->ops->listen();
    sockfd_cli = sock_create(...);
    sockfd_srv->ops->accept(..., &sockfd_cli);
    ....(do something)
    sock_release(sockfd_cli);
}
即使我通过sock_release()释放客户端套接字,上述程序也会导致内存泄漏。最后,系统将内存不足

我将其更改为使用sock\u create\u lite()而不是sock\u create()


然后内存泄漏问题就消失了。

我必须纠正我的问题。最初,我认为这是内存泄漏问题。但我有以下发现。我的任务是在内核空间中创建一个套接字服务器。每次我的程序接受传入的连接(没有任何数据传输)然后关闭它时,我发现它会消耗一些内存(通过“free”命令观察)。即使我通过sock_release()关闭套接字连接,内存使用量也不会减少。最后,系统打印“内存不足”,然后崩溃。我已经将tcp_tw_recycle和tcp_tw_reuse设置为1,以减少时间等待状态下的tcp等待时间。Linux内核版本为3.2.0。谢谢。但现在我发现这似乎是Linux内核的错误。
sockfd_srv = sock_create(...)
...
while(1) {
    sockfd_srv->ops->listen();
    sockfd_cli = sock_create(...);
    sockfd_srv->ops->accept(..., &sockfd_cli);
    ....(do something)
    sock_release(sockfd_cli);
}
sockfd_srv = sock_create(...)
...
while(1) {
    sockfd_srv->ops->listen();
    sockfd_cli = sock_create_lite(...);
    sockfd_srv->ops->accept(..., &sockfd_cli);
    ....(do something)
    sock_release(sockfd_cli);
}