insmod:错误:无法插入模块:没有子进程

时间:2016-03-11 20:01:12

标签: linux sockets kernel netlink

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

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

和内核日志显示它在打印失败

Error creating socket nl_sk

我认为这是一个常见错误,我不认为它必须对模块做任何事情。

我只是在模块中创建两个netlink套接字。当我评论第二个套接字创建行时,使用一个netlink套接字,模块工作正常,但是下面的代码粘贴了两个,它给出了这个错误,然后再次,当我尝试使用一个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;
}

任何人都可以对此有所了解吗?

2 个答案:

答案 0 :(得分:2)

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

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

我的建议是将代码重构为:

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; } 功能

中添加匹配的netlink_kernel_release来电

答案 1 :(得分:0)

好的,我将#define NETLINK_USER1 32的值从32更改为30并且运行正常。两个套接字都创建了。需要看fn原型

netlink_kernel_create(&init_net, NETLINK_USER1, &cfg1);

检查它期望作为中间参数的可能值。