我一直在开发一个用 C 编写的应用程序,它使用 GLib 并且专门针对 Linux。通常我的经验是 GLib 的实用程序很有用,并且与仅使用 C 标准库相比,通常可以使编写 C 更容易。然后我注意到g_strdup
存在。阅读一些文档strdup
,我没有注意到任何明显的区别,除了g_strdup
指定你可以传递 NULL 而strdup
没有提到它在这种情况下的行为方式。
有了这些信息,我有什么理由使用g_strdup
吗strdup
?
我正在开发一个用 C 编写的 GTK 程序。在特定函数中,adw_combo_row_set_model ()
我需要提供一个GListModel
。我有一个GList
。我怎样才能将 GList 转换为 GListModel 或以其他方式提供与 GListModel 兼容的 GList 视图?
我正在使用 GLib 和 C 制作一个应用程序,其中我需要存储一个字符串列表(即 的列表char*
)。最初,我以为我会使用 GList 或 GArray,但后来我意识到字符串只是指针,因此 GPtrArray 可能最容易使用,所以我使用了它。我遇到的唯一问题是,char*
当通过 as 访问它时,我必须将值转换回 a g_ptr_array_index
,否则我只会得到一个gpointer
/ void*
。如果我不进行转换,我会得到以下错误:
src/main.c:769:18: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘gpointer’ {aka ‘void *’} [-Werror=format=]
769 | printf("%s\n", g_ptr_array_index(setting_zero->key, 0));
| ~^
| |
| char *
| %p
但是,尽管我觉得它不对劲(我对编写 C 代码没有特别的经验),但如果我添加了强制类型转换,它似乎可以正常工作。
因此,我想问一下,GPtrArray
在 C 中用它来存储字符串数组是否正确?
我正在开发一个 Python 应用程序,它将以各种形式(Flatpak、PyInstaller 可执行文件,也许还有其他)分发给 Linux 上的用户。在这个应用程序中,我想调用dbus 接口Inhibit
上的方法org.freedesktop.login1.Manager
。由于相对复杂/多样化的分发要求,我选择了 dbus-fast,它是 dbus 的纯 Python 实现。此外,dbus-python 的作者在库文档的开头就给出了各种警告,这是 dbus-fast 的另一个优点。
无论如何,dbus-fast 似乎总体上运行良好,并且我能够ListUsers
毫无问题地调用该方法,如下所示:
import asyncio
from dbus_fast import BusType
from dbus_fast.aio import MessageBus
async def list_users() -> None:
system_bus = await MessageBus(bus_type=BusType.SYSTEM).connect()
introspection = await system_bus.introspect(
"org.freedesktop.login1",
"/org/freedesktop/login1",
)
login_object = system_bus.get_proxy_object(
"org.freedesktop.login1",
"/org/freedesktop/login1",
introspection,
)
login_manager_interface = login_object.get_interface(
"org.freedesktop.login1.Manager",
)
user_list = await login_manager_interface.call_list_users()
print(user_list)
asyncio.run(list_users())
然后我可以运行并获取如下列表:
$ python -m dbus_list_users
[[1000, 'newbyte', '/org/freedesktop/login1/user/_1000']]
但是,如果我尝试调用该Inhibit
方法,则会得到EOFError
,我不明白在这种情况下它的含义。以下是代码:
import asyncio
from dbus_fast import BusType
from dbus_fast.aio import MessageBus
async def do_inhibit() -> None:
system_bus = await MessageBus(bus_type=BusType.SYSTEM).connect()
introspection = await system_bus.introspect(
"org.freedesktop.login1",
"/org/freedesktop/login1",
)
login_object = system_bus.get_proxy_object(
"org.freedesktop.login1",
"/org/freedesktop/login1",
introspection,
)
login_manager_interface = login_object.get_interface(
"org.freedesktop.login1.Manager",
)
inhibit_fd = await login_manager_interface.call_inhibit(
"sleep",
"Stack Overflow example man",
"To demonstrate that it does not work",
"delay",
)
print(inhibit_fd)
asyncio.run(do_inhibit())
运行它给了我这个很长的回溯:
$ python -m dbus_inhibit
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/mnt/storage/Programming/sparvio_toolbox/dbus_inhibit.py", line 28, in <module>
asyncio.run(do_inhibit())
File "/usr/lib64/python3.12/asyncio/runners.py", line 194, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "/usr/lib64/python3.12/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib64/python3.12/asyncio/base_events.py", line 687, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "/mnt/storage/Programming/sparvio_toolbox/dbus_inhibit.py", line 20, in do_inhibit
inhibit_fd = await login_manager_interface.call_inhibit(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/mnt/storage/Programming/sparvio_toolbox/_host-env/lib64/python3.12/site-packages/dbus_fast/aio/proxy_object.py", line 92, in method_fn
msg = await self.bus.call(
^^^^^^^^^^^^^^^^^^^^
File "/mnt/storage/Programming/sparvio_toolbox/_host-env/lib64/python3.12/site-packages/dbus_fast/aio/message_bus.py", line 385, in call
await future
File "src/dbus_fast/aio/message_reader.py", line 19, in dbus_fast.aio.message_reader._message_reader
File "src/dbus_fast/_private/unmarshaller.py", line 775, in dbus_fast._private.unmarshaller.Unmarshaller._unmarshall
File "src/dbus_fast/_private/unmarshaller.py", line 636, in dbus_fast._private.unmarshaller.Unmarshaller._read_header
File "src/dbus_fast/_private/unmarshaller.py", line 376, in dbus_fast._private.unmarshaller.Unmarshaller._read_to_pos
File "src/dbus_fast/_private/unmarshaller.py", line 339, in dbus_fast._private.unmarshaller.Unmarshaller._read_sock_without_fds
EOFError
我不明白这是什么意思。我尝试查看systemd 中有关抑制锁的官方文档,但一无所获。如何使用 dbus_python 在 Python 中调用抑制锁Inhibit
的方法org.freedesktop.login1.Manager
并获取抑制锁?