Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C D-bus:无法创建属性:sd_总线_添加_对象_vtable失败_C_Properties_Ipc_Systemd_Dbus - Fatal编程技术网

C D-bus:无法创建属性:sd_总线_添加_对象_vtable失败

C D-bus:无法创建属性:sd_总线_添加_对象_vtable失败,c,properties,ipc,systemd,dbus,C,Properties,Ipc,Systemd,Dbus,我试图在系统总线上创建一个属性,使用复杂签名,在我的示例中是两个有符号整数。源文件test.c: #include <stdio.h> #include <stdint.h> #include <systemd/sd-bus.h> #include <systemd/sd-bus-vtable.h> #define DATA_INTERFACE "com.myexample.myproject" #define DATA_PATH "/com/m

我试图在系统总线上创建一个属性,使用复杂签名,在我的示例中是两个有符号整数。源文件test.c:

#include <stdio.h>
#include <stdint.h>
#include <systemd/sd-bus.h>
#include <systemd/sd-bus-vtable.h>

#define DATA_INTERFACE "com.myexample.myproject"
#define DATA_PATH "/com/myexample/myproject"
#define DATA_PROPERTY "data"
#define DATA_SIGNATURE "ii"

static int get_property_cb(sd_bus*_bus,         
                const char* path,
                const char* interface,
                const char* property,
                sd_bus_message* reply,
                void* userdata,
                sd_bus_error* ret_error)
{
    int ret = 1;
    sd_bus_message_open_container(reply, 'r', DATA_SIGNATURE);
    sd_bus_message_append(reply, "i", 111);
    sd_bus_message_append(reply, "i", 222);
    sd_bus_message_close_container(reply);
    return ret;
}

static const sd_bus_vtable prop_spec[3] = {
    SD_BUS_VTABLE_START(0),
    SD_BUS_PROPERTY(DATA_PROPERTY, DATA_SIGNATURE, get_property_cb, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
    SD_BUS_VTABLE_END
};

int main ()
{
    sd_bus* _bus = NULL;
    sd_bus_slot* _slot = NULL;
    int ret = 0;
    ret = sd_bus_open_system(&_bus);
    if(ret < 0) {
        fprintf(stderr, "Error: sd_bus_open ret %d\n", ret);
        return -1;
    }
    ret = sd_bus_request_name(_bus, DATA_INTERFACE, 0);
    if(ret < 0) {
        fprintf(stderr, "Error: sd_bus_request_name ret %d\n", ret);
        return -1;
    }
    ret = sd_bus_add_object_vtable(_bus, &_slot, DATA_PATH, DATA_INTERFACE, prop_spec, NULL);
    if(ret < 0) {
        fprintf(stderr, "Error: sd_bus_add_object_vtable ret %d\n", ret);
        return -1;
    }
    printf("!!!Success!!!\n");
    sd_bus_slot_unref(_slot);
    sd_bus_unref(_bus);
    return 0;
}
我以root用户身份运行它:

sudo ./test
绞尽脑汁为什么sd_总线_添加_对象_vtable返回-22(-EINVAL)


有人知道怎么回事吗?

签名必须写在括号内:

#define DATA_SIGNATURE "(ii)"
此外,不需要文件/usr/share/dbus-1/services/com.myexample.myproject.service和/usr/share/dbus-1/interfaces/com.myexample.myproject.xml

[D-BUS Service]
Name=com.myexample.myproject
Exec=/home/user/test

sudo ./test
#define DATA_SIGNATURE "(ii)"