我无法弄清楚如何在C / C ++中检查是否通过launchd启用了服务。我知道我可以从命令行使用launchctl,目前正在从fork / exec执行'launchctl list myServiceName'。
我发现boostrap_look_up()可能是检查这个问题的方法,但是我找不到足够的文档来将其压缩成一个简单的例子。
你能说清楚吗?我只需要一个小函数来测试我的服务是否实际已注册并可用。
答案 0 :(得分:1)
Apple已开源launchd
,源代码位于http://opensource.apple.com/source/launchd/launchd-442.26.2/
launchctl
的源代码位于support/launchctl.c。希望你能够在那里找到你需要的东西。我怀疑你需要查看list_cmd
函数大约三分之二的文件。
如果答案不在launchctl.c
,那么我真的不知道它会在哪里。
最初我开始在launchctl
二进制文件中查找符号。
您提及的bootstrap_look_up()
功能似乎在launchd/liblaunch/libbootstrap.c
中定义。
运行nm /bin/launchctl
提供了许多有趣的符号:
...
U _bootstrap_get_root
U _bootstrap_info
U _bootstrap_look_up_per_user
U _bootstrap_lookup_children
U _bootstrap_parent
U _bootstrap_port
...
U _launch_data_alloc
U _launch_data_array_get_count
U _launch_data_array_get_index
U _launch_data_array_set_index
U _launch_data_copy
U _launch_data_dict_insert
U _launch_data_dict_iterate
U _launch_data_dict_lookup
U _launch_data_dict_remove
U _launch_data_free
U _launch_data_get_bool
U _launch_data_get_errno
U _launch_data_get_fd
U _launch_data_get_integer
U _launch_data_get_machport
U _launch_data_get_opaque
U _launch_data_get_opaque_size
U _launch_data_get_real
U _launch_data_get_string
U _launch_data_get_type
U _launch_data_new_bool
U _launch_data_new_fd
U _launch_data_new_opaque
U _launch_data_new_string
U _launch_data_set_bool
U _launch_data_set_integer
U _launch_data_set_opaque
U _launch_data_set_real
U _launch_data_set_string
U _launch_msg
...
这些launch_data_
函数似乎在launchd/launch/liblaunch.c
中声明。
据我所知,liblaunch
未安装为系统库,libSystem
似乎也未包含这些符号(只导出bootstrap_init
)。
我建议下载launchd
来源,编译自己的liblaunch
,看看是否可以通过将其链接到项目来获得所需的功能。我不知道这是否会做你想要的。