C:发送D-BUS信号的损坏的迭代器

时间:2014-09-20 21:11:53

标签: c segmentation-fault dbus

我试图让我的程序通过发送相应的D-BUS消息来锁定和解锁GNOME屏幕。 通过shell中的dbus-send执行该参数,参数如下所示。

锁定:

dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock

解锁:

dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.SetActive boolean:false

以下是C代码:

void sendDbusSignal(char *action)
{
DBusMessage* msg;
DBusMessageIter args;
DBusConnection* conn;
DBusError err;
DBusPendingCall* pending;
int ret;
dbus_bool_t v_BOOLEAN;

dbus_error_init(&err);
if ( strcmp(action, "SetActive") == 0 ) {
    v_BOOLEAN = false;
    printf("running dbus_message_iter_append_basic");
    dbus_message_iter_append_basic(&args, DBUS_TYPE_BOOLEAN, &v_BOOLEAN);
}

// connect to the system bus and check for errors
conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
if (dbus_error_is_set(&err)) {
    fprintf(stderr, "Connection Error (%s)\n", err.message);
    dbus_error_free(&err);
}
if (conn == NULL) {
    exit(1);
}

// request our name on the bus
ret = dbus_bus_request_name(conn, "org.gnome.TypingMonitor", DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
if (dbus_error_is_set(&err)) {
    fprintf(stderr, "Name Error (%s)\n", err.message);
    dbus_error_free(&err);
}
if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
    exit(1);
}

msg = dbus_message_new_method_call("org.gnome.ScreenSaver", // target for the method call
                          "/org/gnome/ScreenSaver", // object to call on
                          "org.gnome.ScreenSaver", // interface to call on
                          action); // method name
dbus_message_iter_init_append(msg, &args);
// send message and get a handle for a reply
if (!dbus_connection_send_with_reply (conn, msg, &pending, -1)) { // -1 is default timeout
    fprintf(stderr, "Out Of Memory!\n");
    exit(1);
}
if (pending == NULL) {
    fprintf(stderr, "Pending Call Null\n");
    exit(1);
}
dbus_connection_flush(conn);

printf("Request Sent\n");

// free message
dbus_message_unref(msg);

// free the pending message handle
dbus_pending_call_unref(pending);
}

int main()
{
sendDbusSignal("Lock");
sleep(5);
sendDbusSignal("SetActive");
return 0;
}

以下是我开球时会发生的事情:

  1. "锁"信号已成功发送且屏幕被锁定
  2. 睡5秒
  3. 执行sendDbusSignal(" SetActive")抛出"进程8905:dbus消息迭代器看起来未初始化或已损坏"
  4. 有谁知道这里有什么问题?

1 个答案:

答案 0 :(得分:2)

在初始化之前,你无法开始使用迭代器:dbus_message_iter_init_append()调用需要在向它添加任何内容之前进行。

顺便说一下,如果您只是想从C中找到一种简单的方法来使用D-Bus,我真的建议您查看GDBus而不是使用低级别的libdbus API:它确实很多不那么痛苦。