我寫了一個FTP服務器,通過ftpd.command從命令行啓動。 現在我想從Cocoa應用程序運行該命令。可可的守護進程
我想退出應用程序,並且該命令應該保持運行。 當我回到Cocoa應用程序時,它應該知道,如果FTP服務器仍在運行。
有誰可以幫助我嗎? 非常感謝! 朱利安
我寫了一個FTP服務器,通過ftpd.command從命令行啓動。 現在我想從Cocoa應用程序運行該命令。可可的守護進程
我想退出應用程序,並且該命令應該保持運行。 當我回到Cocoa應用程序時,它應該知道,如果FTP服務器仍在運行。
有誰可以幫助我嗎? 非常感謝! 朱利安
我想你將不得不調整你的FTP服務器,以便它不會「阻塞」命令行,直到它完成。我在這裏找到了一些示例代碼:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <unistd.h>
void start_daemon(void)
{
chdir("/");
setsid();
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
open("/dev/null", O_RDWR);
dup(STDIN_FILENO);
dup(STDIN_FILENO);
for(;;)
sleep(100);
}
int main(int argc, char *argv[])
{
pid_t pid;
if ((pid = fork()) < 0)
{
perror("fork() failed");
return 1;
}
if (pid == 0)
start_daemon();
printf("Child has PID %i.\n", pid);
return 0;
}
您應該使用launchd
來處理FTP服務器。它專爲您所描述的情況而設計,即啓動和管理後臺服務。
你需要創建一個launchd
配置文件,它可以放置在這些位置之一:
~/Library/LaunchAgents
:由用戶提供的每用戶代理。/Library/LaunchAgents
:管理員提供的每用戶代理。/Library/LaunchDaemons
:系統範圍的守護程序由 管理員提供。一個守護是一個全系統的服務,其中還有爲所有客戶一個實例。 代理是基於每個用戶運行的服務。
launchd
Configuration files是一個property list.
你需要創建一個launchd
配置的plist,並將其放置在以上地區的一個形式。您可以配置plist,以便launchd
在啓動時或定期運行您的服務,或者響應各種操作(例如文件夾內容的更改)。
要檢查您的工作是否正在運行,您需要使用Service Management framework。你可以問launchd
爲你工作的狀態,像這樣:
CFDictionaryRef jobDict = SMJobCopyDictionary(kSMDomainUserLaunchd, CFSTR("com.your.apps.bundle.id"));
如果作業無法找到,那麼jobDict
會NULL
。
(如果您使用的是系統級守護程序,那麼您將用kSMDomainSystemLaunchd
代替kSMDomainUserLaunchd
)。
在GitHub上查看我的項目TabletMagic的源代碼。它有一個Cocoa首選項窗格,它啓動一個用戶空間守護進程,並且管理一個已啓動的項目。 Cocoa部分使用外部幫助來完成其所有特權任務,這是首次啓動時的自設置 - 在Cocoa應用程序的特權上下文中請求管理員授權。這是所有標準程序,儘管不是純粹的可可。
這是一個決定性的非可可解決方案。 –