我用的是RHEL 8,系统D版本是239-74 我想在c++上使用dbus获取数据. 只使用一个容器不成问题(但这种情况在退出容器时也会出现相同的错误) 但是,当我应该再使用一个容器时,我得到了"设备或资源繁忙"

#include <iostream>
#include <unistd.h>
#include <systemd/sd-bus.h>

int main() {
        sd_bus_error error = SD_BUS_ERROR_NULL;
        sd_bus *bus = nullptr;
        int ret = sd_bus_open_system(&bus);
        const char *service_name = "org.freedesktop.systemd1";
        const char *object_path = "/org/freedesktop/systemd1";
        const char *interface = "org.freedesktop.systemd1.Manager";
        const char *method = "ListUnits";

        sd_bus_message *reply = nullptr;
        ret = sd_bus_call_method(bus,
                        service_name,
                        object_path,
                        interface,
                        method,
                        &error,
                        &reply,
                        "");
        if (ret < 0) {
                return 1;
        }
        const char *unit_name;
        const char *unit_description;
        const char *unit_load_state;
        const char *unit_active_state;
        const char *sub_state,*followed_state,*object1_path,*queued_job,*job_type,*job_object_path;
        unsigned int uint;

        ret = sd_bus_message_enter_container(reply, 'a', "(ssssssouso)");
        if(ret<0){
                std::cerr <<strerror(-ret);
        }
        ret = sd_bus_message_exit_container(reply);
        if(ret<0){
                std::cerr <<strerror(-ret);
        }
        sd_bus_message_unref(reply);
        sd_bus_unref(bus);

        return 0;
}

我认为是环境问题,但在Ubuntu上,同样的错误也发生了. 我想读取DICT数组,但无法退出容器,因此无法获取其他数据

推荐答案

从文档中:

请注意,SD_BUS_MESSAGE_EXIT_CONTAINER()只能在遍历容器的所有成员后调用,即读取或跳过它们.

在退出容器之前,您需要消耗数组的内容:

ret = sd_bus_message_enter_container(reply, 'a', "(ssssssouso)");
if(ret<0){
    std::cerr <<strerror(-ret);
}

struct {
    const char *primary_name, *human_name, *load_state, *active_state, *sub_state, *following;
    const char **unit_object_path;
    uint32_t queued_job_id;
    const char *job_type
    const char **job_object_path;
} unit;

for (;;) {
    ret = sd_bus_message_read(reply, "(ssssssouso)", &unit.primary_name, &unit.human_name, &unit.load_state, &unit.active_state, &unit.sub_state, &unit.following, &unit.unit_object_path, &unit.queued_job_id, &unit.job_type, &unit.job_object_path);
    if (ret == 0) {
        // done reading
        break;
    }
    if(ret<0){
        std::cerr <<strerror(-ret);
        break;
    }
}

ret = sd_bus_message_exit_container(reply);
if(ret<0){
    std::cerr <<strerror(-ret);
}

Linux相关问答推荐

有没有方法在Linux中连接两个程序输出/输入?

是否可以在Bash正则表达式中排除?

为什么在Linux上STD::SLEEP_FOR(STD::Chrono::Hors::Max())会立即返回?

Docker 默认使用交换文件吗?

为什么 linux shell diff 命令有时会显示与空行相关的输出,即使存在 -B(--ignore-blank-lines)选项?

使用文件名重新打开 linux 管道(仅从一侧)

如何更改文件的上次访问/修改/更改日期?

sed 根据文件中的条件进行多次替换

如何用 Sed 替换 Match 后的 2 个连续行

根据外部请求在 Netbeans 中启动 XDebug

如何在 Linux 中向应用程序发出信号而不杀死它?

Ant 找不到 javac,在 Ubuntu 上不会设置 JAVA_HOME

根据文件名模式和文件内容列出文件名?

我可以告诉 Linux 不要换出特定进程的内存吗?

Linux 上真的没有异步块 I/O 吗?

.NET Core 中的跨平台文件名处理

Linux SCHED_OTHER、SCHED_FIFO 和 SCHED_RR - 区别

Vim 增量搜索

如何始终以 GB 为单位获取 df linux 命令输出

crontab 在特定小时之间每 15 分钟运行一次