如何检查是否已使用launchd启用服务

时间:2013-06-11 15:43:49

标签: macos launchd

我无法弄清楚如何在C / C ++中检查是否通过launchd启用了服务。我知道我可以从命令行使用launchctl,目前正在从fork / exec执行'launchctl list myServiceName'。

我发现boostrap_look_up()可能是检查这个问题的方法,但是我找不到足够的文档来将其压缩成一个简单的例子。

你能说清楚吗?我只需要一个小函数来测试我的服务是否实际已注册并可用。

1 个答案:

答案 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,看看是否可以通过将其链接到项目来获得所需的功能。我不知道这是否会做你想要的。