我编写了一个内核驱动程序“hello_kernel”,它在自定义节点/dev/hello 上注册为字符设备。在 hello_kernel.c 文件中,调用 register_chrdev() 后,我尝试使用 netlink_kernel_create() (在 netlink.h 中定义)创建一个 netlink 套接字,并使用正确定义的函数通过此套接字接收用户空间消息。
代码编译完美,我使用 mknod 使设备 nod/dev/hello;但是当我尝试 insmod 这个模块( hello_kernel.ko )时,出现错误:
insmod:插入“hello_kernel.ko”时出错:-1 没有子进程
dmesg 命令显示套接字创建(即使用 netlink_kernel_create())时出现错误。
最初,我试图使用这个模块来连接仅使用 netlink 套接字的用户空间应用程序,该应用程序运行良好。我添加字符设备功能的动机是使另一个用户应用程序能够像常规设备文件一样打开它并发出 ioctl 调用。
我该怎么做才能让这项工作成功?或者内核不支持合并这两种功能?
代码如下:
result = register_chrdev(major_num, "hello", &hello_fops);
if( result < 0 )
{
printk( KERN_INFO "Could not init hello_kernel" );
return result;
}
result=netlink_kernel_create(&init_net, NETLINK_USER, 0, hello_nl_recv_msg,NULL,
THIS_MODULE);
if(!result)
{
unregister_chrdev(major_num, "memory");
printk(KERN_ALERT "Error creating socket.\n");
return -10;
}
尝试插入模块:
$sudo insmod hello_kernel.ko
insmod: error inserting 'hello_kernel.ko': -1 No child processes
dmesg 的输出:
[ 1537.809491] Error creating socket.
最佳答案
问题出在注册设备后创建套接字。现在,我在设备注册(register_chrdev)之前创建套接字(netlink_kernel_create),重新启动后,它就可以工作了:)
关于linux - 在 Linux 内核中使用 netlink 套接字在用户空间应用程序和字符设备之间进行通信时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10170988/