Демон с какао - PullRequest
       54

Демон с какао

2 голосов
/ 27 ноября 2011

Я написал FTP-сервер, который запускается из командной строки через ftpd.command.Теперь я хочу запустить эту команду из приложения Какао.

Я хочу выйти из приложения, и команда должна остаться запущенной.И когда я вернусь к приложению Какао, он должен знать, работает ли FTP-сервер.

Кто-нибудь может мне помочь?Большое спасибо!Julian

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Вы должны использовать launchd для обработки FTP-сервера.Он специально разработан для описываемой вами ситуации, а именно запуска и управления фоновыми службами.

Вам необходимо создать файл конфигурации launchd, который можно разместить в одном из следующих мест:

  • ~/Library/LaunchAgents: пользовательские агенты, предоставленные пользователем.
  • /Library/LaunchAgents: пользовательские агенты, предоставленные администратором.
  • /Library/LaunchDaemons: общесистемные демоны, предоставленные администратором.

A daemon - это общесистемная служба, для которой существует один экземпляр для всех клиентов. агент - это служба, работающая для каждого пользователя.

launchd Файлы конфигурации имеют форму список свойств.

Вам необходимо создать лист конфигурации launchd и поместить его в одно из указанных выше мест.Вы можете настроить plist так, чтобы launchd запускал вашу службу при запуске или периодически, или в ответ на различные действия (например, изменение содержимого папки).

Чтобы проверить, работает ли ваша работа или нетработает, вам нужно использовать Framework Service Management Framework .Вы можете запросить launchd статус вашей работы следующим образом:

CFDictionaryRef jobDict = SMJobCopyDictionary(kSMDomainUserLaunchd, CFSTR("com.your.apps.bundle.id"));

Если работа не может быть найдена, тогда jobDict будет NULL.

(Если выесли вы используете демон системного уровня, вы должны заменить kSMDomainUserLaunchd на kSMDomainSystemLaunchd).

0 голосов
/ 28 ноября 2011

Взгляните на исходный код моего проекта TabletMagic на GitHub. Он имеет панель настроек Какао, которая запускает демон пространства пользователя, а также управляет запущенным элементом. Часть Cocoa использует внешний помощник для выполнения всех своих привилегированных задач, который устанавливается автоматически при первом запуске - в привилегированном контексте приложением Cocoa, запрашивающим авторизацию администратора. Это все стандартная процедура, несмотря на то, что она не является чистым какао.

0 голосов
/ 27 ноября 2011

Я думаю, вам придется настроить свой 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;
}
...