Создайте демона с двойным ветвлением в Ruby

Анонимный внутренний класс

Говорит, что Вы хотите передать функцию в с String параметрический усилитель, который возвращается int.
Первый необходимо определить интерфейс с функцией как ее единственный участник, если Вы не можете снова использовать существующий.

interface StringFunction {
    int func(String param);
}

метод А, который берет указатель, просто принял бы StringFunction экземпляр как так: [как 1111]

public void takingMethod(StringFunction sf) {
   int i = sf.func("my string");
   // do whatever ...
}

И назвали бы так:

ref.takingMethod(new StringFunction() {
    public int func(String param) {
        // body
    }
});

РЕДАКТИРОВАНИЕ: В Java 8, Вы могли назвать его с лямбда-выражением:

ref.takingMethod(param -> bodyExpression);
27
задан JasonSmith 16 November 2009 в 05:53
поделиться

1 ответ

Согласно Стивенсу Расширенное программирование в среде UNIX , глава 13, это процедура создания хорошо работающего демона Unix:

  1. Форк и родительский выход. Это заставляет оболочку или сценарий загрузки думать, что команда выполнена. Кроме того, гарантируется, что дочерний процесс не будет лидером группы процессов (предварительное условие для setsid next)
  2. . Вызов setsid для создания нового сеанса. Это делает три вещи:
    1. Процесс становится лидером сеанса нового сеанса
    2. Процесс становится лидером группы процессов новой группы процессов
    3. Процесс не имеет управляющего терминала
  3. Необязательно повторяется ветвление и имеет родительский выход. Это гарантирует, что демон не является лидером сеанса и не может получить управляющий терминал (в SVR4)
  4. Измените текущий рабочий каталог на / , чтобы не мешать монтированию и размонтированию
  5. Установить режим файла маска создания на 000, чтобы в дальнейшем разрешить создание файлов с любыми необходимыми разрешениями.
  6. Закройте ненужные файловые дескрипторы, унаследованные от родителя (в любом случае управляющего терминала нет): stdout , stderr , и stdin .

В настоящее время существует файл для отслеживания PID, который активно используется сценариями загрузки дистрибутива Linux. Обязательно запишите PID внука, либо возвращаемое значение второй вилки (шаг 3), либо значение getpid () после шага 3.

Вот реализация Ruby, в основном переведено из книги, но с двойной вилкой и записью PID демона.

# Example double-forking Unix daemon initializer.

raise 'Must run as root' if Process.euid != 0

raise 'First fork failed' if (pid = fork) == -1
exit unless pid.nil?

Process.setsid
raise 'Second fork failed' if (pid = fork) == -1
exit unless pid.nil?
puts "Daemon pid: #{Process.pid}" # Or save it somewhere, etc.

Dir.chdir '/'
File.umask 0000

STDIN.reopen '/dev/null'
STDOUT.reopen '/dev/null', 'a'
STDERR.reopen STDOUT
53
ответ дан 28 November 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: