Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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
Sockets 在自定义模块中调用sock_release()后,内核被卡住_Sockets_Linux Kernel_Kernel Module - Fatal编程技术网

Sockets 在自定义模块中调用sock_release()后,内核被卡住

Sockets 在自定义模块中调用sock_release()后,内核被卡住,sockets,linux-kernel,kernel-module,Sockets,Linux Kernel,Kernel Module,我编写了一个处理基于套接字的TCP连接的内核模块。除了一个特定的用例外,其他一切都很好。如果有人建议我如何解决下面描述的问题,我将不胜感激 我有: 内核模块,它是使用 其他寄存器() 使用标准文件i/o功能与此模块通信的用户空间应用程序:打开, 关闭,ioctl等 具体情况如下所示: 使用insmod加载模块 使用标准的打开()功能从用户应用程序打开相关设备 调用ioctl(),在内核模块中执行以下操作(忽略不重要的代码行): ` ` 所有函数都成功返回。TCP连接已成功建立。之后,也可以在此连

我编写了一个处理基于套接字的TCP连接的内核模块。除了一个特定的用例外,其他一切都很好。如果有人建议我如何解决下面描述的问题,我将不胜感激

我有:

  • 内核模块,它是使用 其他寄存器()
  • 使用标准文件i/o功能与此模块通信的用户空间应用程序:打开关闭ioctl
  • 具体情况如下所示:

  • 使用insmod加载模块
  • 使用标准的打开()功能从用户应用程序打开相关设备
  • 调用ioctl(),在内核模块中执行以下操作(忽略不重要的代码行):
  • `

    `

    所有函数都成功返回。TCP连接已成功建立。之后,也可以在此连接上读取/写入tere,但这不会影响问题

    如果应用程序自然完成,或者我通过发送SIGINT来中断它,那么连接会很好地关闭——使用FIN exchange等。在SIGKILL上,它会像我预期的那样发出TCP。到目前为止没有问题

    现在我想关闭这个没有停止应用程序的套接字。我试图通过另一个ioctl调用来调用内核模块中的sock\u release()。在这个调用中,TCP连接也很好地关闭了。然而,现在当我的应用程序完成或被中断时,内核被卡住了

    我怀疑内核不知何故没有“通知”套接字已关闭。它再次尝试关闭它,一旦套接字内存结构被取消分配,它就会失败

    是否有人使用内核模块中的套接字并遇到类似问题? 您能推荐一种从内核模块使用TCP套接字的替代方法吗? 从内核中关闭套接字的替代方法


    非常感谢您。

    在内核代码调查之后,我发现如果您使用sock\u map\u fd()函数将套接字映射到一个文件,那么调用sock\u release()是不够的。此函数不会释放与套接字关联的文件描述符。如果确实需要将内核套接字映射到文件,请保留由sock\u map\u fd()返回的文件描述符,并使用sys\u close()函数关闭套接字并清理关联的文件。请注意,当关闭设备文件描述符时,模块中创建并与文件关联的所有套接字也将自动关闭

    或者,您可以避免将套接字映射到文件描述符。即使没有映射,套接字的基本功能也将保持正常。在这种情况下,sock_release()工作正常

    ...
    sock_create(PF_INET, SOCK_STREAM, 0, sock);
    ...
    flags = O_NONBLOCK;
    sock_map_fd(*sock, flags);
    ...
    kernel_connect (sock, (struct sockaddr *)server_addr, sizeof(struct sockaddr_in), sock->file->f_flags);
    ...