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