linux 为什么在退出sd-bus容器时会出现错误?

siotufzp  于 5个月前  发布在  Linux
关注(0)|答案(1)|浏览(73)

我正在使用RHEL 8和systemd版本是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的数组,但我无法退出容器,所以我无法获取其他数据

yvfmudvl

yvfmudvl1#

从文档中:
请注意,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);
}

字符串

相关问题