- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试编写一些基本的内核模块——使用 netlink 套接字(用户端的 libnl)的用户空间程序通信。用户空间程序向内核发送消息并期待回复。不幸的是,接收回复失败,返回值 -16 (EBUSY)。
有趣的是,当我直接从 netlink 套接字接收数据时,在 nl_socket_get_fd(sock)
上使用标准系统调用 recv
,一切正常!
有人知道为什么会这样吗?
这是用户空间代码(parse_cb 是一个不会被调用的回调):
struct nl_sock *sock;
struct nl_msg *msg;
int family, res;
// Allocate a new netlink socket
sock = nl_socket_alloc();
// Connect to generic netlink socket on kernel side
genl_connect(sock);
// Ask kernel to resolve family name to family id
family = genl_ctrl_resolve(sock, PSVFS_FAMILY_NAME);
// Construct a generic netlink by allocating a new message, fill in
// the header and append a simple integer attribute.
msg = nlmsg_alloc();
genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0, NLM_F_ECHO,
PSVFS_C_INIT, PSVFS_VERSION);
nla_put_string(msg, PSVFS_A_MSG, "stuff");
// Send message over netlink socket
nl_send_auto_complete(sock, msg);
// Free message
nlmsg_free(msg);
nl_socket_modify_cb(sock, NL_CB_VALID, NL_CB_CUSTOM, parse_cb, NULL);
res = nl_recvmsgs_default(sock);
printf("After receive %i.\n", res);
这是用户空间程序发送的消息的内核端回调(这个被正确调用):
int psvfs_vfs_init(struct sk_buff *skb2, struct genl_info *info) {
send_to_daemon("VFS initialized.", PSVFS_C_INIT, info->snd_seq+1, info->snd_pid);
return 0;
}
这里是“send_to_daemon”函数:
int send_to_daemon(char* msg, int command, int seq, u32 pid) {
int res = 0;
struct sk_buff* skb;
void* msg_head;
skb = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
if (skb == NULL) {
res = -ENOMEM;
goto out;
}
msg_head = genlmsg_put(skb, 0, seq, &psvfs_gnl_family, 0, command);
if (msg_head == NULL) {
res = -ENOMEM;
goto out;
}
res = nla_put_string(skb, PSVFS_A_MSG, msg);
if (res != 0)
goto out;
genlmsg_end(skb, msg_head);
res = genlmsg_unicast(&init_net, skb, pid);
if (res != 0)
goto out;
out:
return res;
}
最佳答案
好的,我发现这里出了什么问题。
我终于发现 libnl
函数有自己的错误代码,不同于标准的 POSIX 返回代码,-16 代表 NLE_SEQ_MISMATCH
。
问题是由我分配给消息的错误序列号引起的。
关于linux - Netlink 套接字和 libnl - nl_recvmsgs_default 返回 -16 (EBUSY),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8368495/
所以,我在这行代码中遇到了错误; else if(lockError == EBUSY) 我得到了错误; use of undeclared identifier 'EBUSY' 如何将我的 int
我正在单步执行我们的可执行文件链接到的第三方库中的一些代码,特别是“关闭”代码。我正在向我们的应用程序发送 SIGQUIT,这将关闭第三方对象。 出于某种原因,该库对 pthread_mutex_de
在退出之前,我按以下顺序从 main() 调用: pthread_cancel() 其他线程使用正在“等待”的 mtx(他们正在等待其他 cond_variable 和 mutex。也许这就是问题所在
我有一个非常简单的 Gulpfile: var gulp = require('gulp'), prefix = require('gulp-autoprefixer'), gsass
这是我的问题。我目前正在更新 arm 嵌入式 Linux 机器的内核,从 4.1 到 4.14.73。 我遇到了驱动程序方面的问题。对于内核 4.1,在使用 request_irq 注册 irq 之前
strerror() 函数返回简短的错误描述,将错误编号作为参数。例如,如果参数为ENOTDIR,则返回“Not a directory”,如果参数为EBUSY,则返回“Device or resou
在我所有的搜索尝试中,我只能找到试图修复“EBUSY:资源繁忙或锁定”错误的人。 我想要的是有意地(暂时)将文件置于此状态。如何做到这一点? 我尝试使用来自 NodeJS 的 fs.open、fs.c
有时当我尝试启动 angular-cli 命令时: ng build --app myApplication -w 我收到以下错误: EBUSY: resource busy or locked, u
我正在尝试将行追加到nodejs 中的文件中。我写了下面一段代码。 /* Name : test.js */ /* globals require,__dirname */ var fs = req
我的应用中有一个奇怪的错误。 在我的应用程序中,可以下载一个 zipFile,按原样读取内容并删除它。它到底是什么并不重要。 问题:只有在摩托罗拉 Xoom(4.0.4 版)上我可以下载文件,解压缩,
我的应用程序遇到了这个问题,所以我有一个 stage 文件夹,我们在其中接收文件,目录上有一个 fs.watch,它将监视文件并将文件移动到另一个目录,一旦它看到它。只是为了模仿这个过程,我让应用程序
我正在运行 windows7 并且刚刚安装了以下... c:\design_centre_dev\workspace>node -v v5.10.1 c:\design_centre_dev\work
尝试运行 Nodejs 应用程序来测试 Raspberry 3 B + Gpio Onoff 模块,但是当我尝试运行该应用程序时出现此错误 fs.js:114 throw err; Error: EB
刚刚使用 pip install -U pytest 安装了 py.test 没有错误,但是我们在尝试启动 py.test 时出现错误: EBUSY: [资源设备]: listdir('C:\\Use
在Windows中执行以下步骤后,将发生错误: 打开一个终端:npm run start:dev 打开另一个终端:ng build --watch 但是,通过使用以上命令,它可以在Mac中工作。 pa
我花了几个小时试图自己解决这个问题,同时寻找类似的问题,但没有任何运气,所以我得出的结论是,唯一要做的就是在这里发布一个问题。 我正在开发一个 Web 应用程序的后端,我在其中使用 MongoDB 进
请告诉我是否有任何 sdk,我可以通过它从 c 或 cpp 通信 Oracle eBusiness 套件。我知道 OCCI 用于与 Oracle DB 交互,我正在寻找一种与 Oracle 电子商务套
我正在为 IRQ 号 8 开发一个驱动程序,它对应于 RTC 时钟。我有以下问题。当我用 request_irq 请求那个 IRQ 时,我得到一个 EBUSY 错误。我认为首先使用 free_irq(
我是 Node.js 的新手,我想弄清楚以下代码有什么问题。 var fs = require('fs'); var dir = "C:\\"; var files = fs.readdirSync(
我正在尝试编写一些基本的内核模块——使用 netlink 套接字(用户端的 libnl)的用户空间程序通信。用户空间程序向内核发送消息并期待回复。不幸的是,接收回复失败,返回值 -16 (EBUSY)
我是一名优秀的程序员,十分优秀!