2011-11-27 137 views
2

我寫了一個FTP服務器,通過ftpd.command從命令行啓動。 現在我想從Cocoa應用程序運行該命令。可可的守護進程

我想退出應用程序,並且該命令應該保持運行。 當我回到Cocoa應用程序時,它應該知道,如果FTP服務器仍在運行。

有誰可以幫助我嗎? 非常感謝! 朱利安

回答

0

我想你將不得不調整你的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; 
} 
+2

這是一個決定性的非可可解決方案。 –

2

您應該使用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")); 

如果作業無法找到,那麼jobDictNULL

(如果您使用的是系統級守護程序,那麼您將用kSMDomainSystemLaunchd代替kSMDomainUserLaunchd)。

0

在GitHub上查看我的項目TabletMagic的源代碼。它有一個Cocoa首選項窗格,它啓動一個用戶空間守護進程,並且管理一個已啓動的項目。 Cocoa部分使用外部幫助來完成其所有特權任務,這是首次啓動時的自設置 - 在Cocoa應用程序的特權上下文中請求管理員授權。這是所有標準程序,儘管不是純粹的可可。