我写了一个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应用程序的特权上下文中请求管理员授权。这是所有标准程序,尽管不是纯粹的可可。
这是一个决定性的非可可解决方案。 –