2017-08-10 52 views
4

我正在編寫附帶服務的程序。我到目前爲止所做的是創建一個幫助工具,可以爲我的流程運行提升任務,並可以通過XPC進行通信。在macOS中以編程方式啓用,禁用和啓動服務

我的程序捆綁了一個服務,我想用輔助工具來安裝和啓動/停止這個服務,這樣我的程序就可以在設置中有一個複選框「啓動系統服務」。

我可以成功複製服務的plist,但我找不到任何方式來以編程方式啓用,禁用,啓動或停止服務。我認爲這個解決方案很難看到system("launchctl load /path/to/service.plist");。目標C中是否有任何機制來完成這項任務並取得成功或失敗的結果?

+0

https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html#//apple_ref/doc/uid/10000172i-SW6-SW1你檢查是否是滿足您的需求? –

+0

它沒有。我需要一個LaunchDaemon,而不是LaunchAgent。 – Nidhoegger

回答

1

Apple有一個不推薦的C API用於在launch.h中啓動,停止和啓用launchd服務。對於API的源代碼是開源的網站:https://opensource.apple.com/source/launchd/launchd-442.26.2/liblaunch/

下面是要求launchd會啓動LittleSnitchUIAgent服務的一些示例代碼:

#include <launch.h> 

int main(int argc, const char * argv[]) { 
    const char *job = "at.obdev.LittleSnitchUIAgent"; 
    launch_data_t resp, msg; 
    msg = launch_data_alloc(LAUNCH_DATA_DICTIONARY); 
    launch_data_dict_insert(
     msg, launch_data_new_string(job), LAUNCH_KEY_STARTJOB); 
    resp = launch_msg(msg); 
    launch_data_free(msg); 
    return 0; 
} 

的LittleSnitchUIAgent是不是意義 - 我選擇了它隨意來自我本地的服務列表。我留下錯誤檢查樣本,以保持直觀。

如果你還沒有,我會建議給launchd man pagesDaemons and Services Programming Guide一個非常密切的研究。 Launchd可以響應幾乎任何事情啓動您的進程:定時器,套接字連接,添加到系統中的設備等等。您實際上需要管理自己的服務很少見。我一直無法證實這一點,但我懷疑這就是爲什麼他們已經棄用了API。

+0

非常感謝您提供這類信息。我現在通過打開與服務的XPC連接真正做到了,launchd在傳入連接時按需啓動。 – Nidhoegger

相關問題