linux - insmod : ERROR: could not insert module : No child processes

标签 linux sockets kernel netlink

我正在尝试在 Linux 内核中运行 Linux 内核模块。 但是发生了什么,有时它成功并运行,有时模块插入失败并出现错误:

insmod: ERROR: could not insert module netlinkKernel.ko: No child processes

内核日志显示打印失败

Error creating socket nl_sk

我认为这是一个常见错误,我认为它与模块无关。

我只是在模块中创建两个 netlink 套接字。当我评论第二个套接字创建行时,使用一个 netlink 套接字,模块工作正常,但是有两个粘贴在下面的代码中,它 alywas 给出了这个错误,然后再一次,当我尝试使用一个 netlink 套接字的模块时,它也失败了,我必须重新启动系统。

static int __init hello_init(void) {

printk("Entering: %s\n",__FUNCTION__);
// This is for 3.6 kernels and above.
struct netlink_kernel_cfg cfg = {
    .input = hello_nl_recv_msg,
};


struct netlink_kernel_cfg cfg1 = {
    .input = hello_nl_recv_msg1,
};

nl_sk = netlink_kernel_create(&init_net, NETLINK_USER, &cfg);
nl_sk1 = netlink_kernel_create(&init_net, NETLINK_USER1, &cfg1);
//nl_sk = netlink_kernel_create(&init_net, NETLINK_USER, 0,     hello_nl_recv_msg,NULL,THIS_MODULE);
if(!nl_sk)
{

    printk(KERN_ALERT "Error creating socket nl_sk.\n");
    return -10;

}


if(!nl_sk1)
{

    printk(KERN_ALERT "Error creating socket nl_sk1.\n");
    return -10;

}

return 0;
}

任何人都可以阐明这一点吗?

最佳答案

注意:我(还)不是内核编码大师。

如果我正确理解您的查询,只要第 3 行 netlink_kernel_create 被注释掉,该模块就会正确插入。如果是这种情况,可能是因为一旦为特定单元 (NETLINK_USER) 创建了 Netlink 套接字,就需要使用 netlink_kernel_release 释放它,然后才能重新创建它再次使用另一个 netlink_kernel_create。这也是为什么你不能加载已经加载失败的模块的原因;您永远不会释放分配的网络链接套接字。此外,对于 3.7 之后的内核,第三次调用 netlink_kernel_create 是不正确的。

我的建议是将您的代码重组为如下所示:

nl_sk = netlink_kernel_create(&init_net, NETLINK_USER, &cfg);
if(!nl_sk)
{
  printk(KERN_ALERT "Error creating socket nl_sk.\n");
  return -10;
}

nl_sk1 = netlink_kernel_create(&init_net, NETLINK_USER1, &cfg1);
if(!nl_sk1)
{
  printk(KERN_ALERT "Error creating socket nl_sk1.\n");
  netlink_kernel_release(nl_sk);
  return -10;
}

此外,您应该在 module_exit 函数中包含匹配的 netlink_kernel_release 调用

关于linux - insmod : ERROR: could not insert module : No child processes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35948879/

相关文章:

python - 如何在linux机器上安装Scrapy

java - 服务器(Python)-使用套接字的客户端(Java)通信

c - 是否可以直接从文件写入套接字?

c++ - `ifreq` 结构中的 IPv6 地址问题

c - Linux 如何为其物理分配器分配内存?

php - Linux CentOS 7 - 通过.htaccess配置httpd.conf文件

python - aws crontab 无法使用子进程工作

linux - Linux内核中这个 'typedef'是什么意思?

Linux 内核/proc FIFO/管道

linux - 在 tbz 存档中解压缩单个文件