2011-11-27 109 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应用程序的特权上下文中请求管理员授权。这是所有标准程序,尽管不是纯粹的可可。