АнглийскийФранцузскийИспанский

Значок OnWorks

perlfork - Интернет в облаке

Запустите perlfork в бесплатном хостинг-провайдере OnWorks через Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS

Это команда perlfork, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.

ПРОГРАММА:

ИМЯ


perlfork - эмуляция Perl fork ()

СИНТАКСИС


ПРИМЕЧАНИЕ. Начиная с версии 5.8.0, эмуляция fork () значительно
созрел. Однако есть еще несколько известных ошибок и отличий.
из реальной fork (), которая может повлиять на вас. См. «ОШИБКИ» и
«ПРЕДОСТЕРЕЖЕНИЯ И ОГРАНИЧЕНИЯ» разделы ниже.

Perl предоставляет вилка () ключевое слово, соответствующее одноименному системному вызову Unix.
На большинстве Unix-подобных платформ, где вилка () системный вызов доступен, Perl's вилка ()
просто называет это.

На некоторых платформах, таких как Windows, где вилка () системный вызов недоступен, Perl может
быть построенным, чтобы подражать вилка () на уровне переводчика. Хотя эмуляция предназначена для
быть максимально совместимым с реальным вилка () на уровне программы Perl там
есть определенные важные отличия, которые проистекают из того факта, что все псевдодетские
"процессы", созданные таким образом, живут в том же реальном процессе, что и операционная система.
обеспокоен.

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

ОПИСАНИЕ


Команда вилка () эмуляция реализована на уровне интерпретатора Perl. Что это значит
в общем это работает вилка () фактически клонирует работающий интерпретатор и все его
состояние и запустить клонированный интерпретатор в отдельном потоке, начиная выполнение в новом
поток сразу после точки, где вилка () был вызван в родительском. Мы будем ссылаться на
поток, который реализует этот дочерний «процесс» как псевдопроцесс.

В программу Perl, которая вызывала вилка (), все это должно быть прозрачным. В
родитель возвращается из вилка () с идентификатором псевдопроцесса, который впоследствии может быть использован в
любые функции управления процессом; ребенок возвращается из вилка () со значением от 0 до
означает, что это дочерний псевдопроцесс.

Поведение of другими Perl функции in раздвоенный псевдопроцессы
Большинство функций Perl естественным образом работают в псевдопроцессах.

$$ или $ PROCESS_ID
Эта специальная переменная правильно установлена ​​на идентификатор псевдопроцесса. Его можно использовать
для выявления псевдопроцессов в рамках определенного сеанса. Обратите внимание, что это значение
подлежат переработке, если какие-либо псевдопроцессы запускаются после того, как другие были
ждать()-ед дальше.

% ENV Каждый псевдопроцесс поддерживает свою собственную виртуальную среду. Изменения в% ENV
влияют на виртуальную среду и видны только в этом псевдопроцессе,
и в любых запущенных из него процессах (или псевдопроцессах).

chdir () и все другие встроенные команды, которые принимают имена файлов
Каждый псевдопроцесс поддерживает собственное виртуальное представление о текущем каталоге.
Изменения в текущем каталоге с помощью chdir () видны только внутри этого
псевдопроцесс, и в любых процессах (или псевдопроцессах), запущенных из него. Все
доступ к файлам и каталогам из псевдопроцесса будет правильно отображать виртуальный
рабочий каталог в реальный рабочий каталог соответствующим образом.

ждать() и waitpid ()
ждать() и waitpid () может быть передан идентификатор псевдопроцесса, возвращаемый вилка (), Эти
вызовы будут правильно ждать завершения псевдопроцесса и возвращать его
Статус.

убийство() «kill ('KILL', ...)» можно использовать для завершения псевдопроцесса, передав ему идентификатор.
вернулся вилка (). Результат kill в псевдопроцессе непредсказуем и
его не следует использовать, кроме как в ужасных обстоятельствах, потому что работающий
система не может гарантировать целостность ресурсов процесса, когда запущенный поток
прекращено. Процесс, реализующий псевдопроцессы, может быть заблокирован
и интерпретатор Perl зависает. Обратите внимание, что использование "kill ('KILL', ...)" в
псевдо-процесс() обычно может вызвать утечку памяти, потому что поток, который
реализует псевдопроцесс, не имеет возможности очистить свои ресурсы.

«kill ('TERM', ...)» также может использоваться в псевдопроцессах, но сигнал не будет
доставляться, пока псевдопроцесс заблокирован системным вызовом, например, ожидая
для сокета для подключения или попытки чтения из сокета без доступных данных.
Начиная с Perl 5.14 родительский процесс не будет ждать, пока дочерний процесс завершится один раз
они получили сигнал «kill ('TERM', ...)», чтобы избежать взаимоблокировки во время процесса.
выход. Вам нужно будет явно позвонить waitpid () чтобы у ребенка было время
чтобы очистить себя, но тогда вы также несете ответственность за то, чтобы ребенок не
блокировки по вводу / выводу тоже.

exec () призвание exec () внутри псевдопроцесса фактически порождает запрошенный исполняемый файл в
отдельный процесс и ожидает его завершения, прежде чем выйти с тем же выходом
статус как этот процесс. Это означает, что идентификатор процесса, указанный в
исполняемый файл будет отличаться от того, что было в более раннем Perl вилка () должно быть
вернулся. Точно так же любые функции манипулирования процессами, применяемые к идентификатору
вернулся вилка () повлияет на ожидающий псевдопроцесс, который вызвал exec (), Не
реальный процесс, которого он ждет после exec ().

После появления exec () вызывается внутри псевдопроцесса, затем методы DESTROY и блоки END
будет по-прежнему вызываться после возврата внешнего процесса.

Выход() Выход() всегда выходит только из выполняющегося псевдопроцесса, после автоматического
ждать()-ing для любых выдающихся дочерних псевдопроцессов. Обратите внимание, что это означает, что
процесс в целом не будет завершен, если все запущенные псевдопроцессы не будут
вышел. Ниже приведены некоторые ограничения для открытых дескрипторов файлов.

Открытие дескрипторов файлов, каталогов и сетевых сокетов
Все открытые ручки dup ()-ed в псевдопроцессах, так что закрытие любых дескрипторов в
один процесс не влияет на другие. Ниже приведены некоторые ограничения.

Ресурс рамки
В глазах операционной системы псевдопроцессы, созданные через вилка () эмуляция
просто потоки в одном процессе. Это означает, что любые ограничения на уровне процесса, налагаемые
операционная система применяется ко всем псевдопроцессам вместе взятым. Сюда входят любые
ограничения, накладываемые операционной системой на количество открытых файлов, каталогов и сокетов
обрабатывает, ограничения на использование дискового пространства, ограничения на размер памяти, ограничения на использование ЦП и т. д.

Убийство родителя процесс
Если родительский процесс убит (либо с помощью Perl's убийство() встроенный или используя некоторые
внешние средства) все псевдопроцессы также завершаются, и весь процесс завершается.

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

Начиная с Perl 5.14 родитель не будет ждать() автоматически для любого ребенка, который был
сигнализируется с помощью "kill ('TERM', ...)", чтобы избежать тупиковой ситуации в случае, если дочерний элемент блокирует
I / O и никогда не получает сигнал.

Пещеры И ОГРАНИЧЕНИЯ


BEGIN блоки
Команда вилка () эмуляция будет работать некорректно при вызове изнутри
НАЧАТЬ блок. Разветвленная копия запустит содержимое блока BEGIN, но будет
не продолжать синтаксический анализ исходного потока после блока BEGIN. Например,
рассмотрим следующий код:

НАЧАТЬ {
развилка и выход; # вилка дочернего элемента и выход из родительского
напечатать "внутренний \ п";
}
напечатать "внешний \ п";

Это напечатает:

внутренний

а не ожидаемый:

внутренний
внешний

Это ограничение возникает из-за фундаментальных технических трудностей при клонировании и
перезапуск стеков, используемых парсером Perl, в середине синтаксического анализа.

Открытые дескрипторы файлов
Любые дескрипторы файлов, открытые во время вилка () будет dup ()-ед. Таким образом, файлы
могут быть закрыты независимо в родительском и дочернем, но имейте в виду, что dup ()-ред.
дескрипторы по-прежнему будут использовать один и тот же указатель поиска. Изменение позиции поиска в
родитель изменит его в дочернем и наоборот. Избежать этого можно, открыв
файлы, которым нужны отдельные указатели поиска отдельно в дочернем элементе.

В некоторых операционных системах, особенно Solaris и Unixware, вызов "exit ()" из
дочерний процесс будет сбрасывать и закрывать открытые дескрипторы файлов в родительском, тем самым
повреждение дескрипторов файлов. В этих системах предлагается вызвать "_exit ()".
вместо. «_exit ()» доступен в Perl через модуль «POSIX». Пожалуйста
обратитесь к руководству вашей системы для получения дополнительной информации об этом.

Дескрипторы открытого каталога
Perl будет полностью читать все дескрипторы открытых каталогов, пока они не достигнут конца
потока. Тогда это будет seekdir () обратно в исходное место и все
в будущем readdir () запросы будут выполняться из буфера кеша. Это означает
что ни дескриптор каталога, удерживаемый родительским процессом, ни тот, который удерживается
дочерний процесс увидит любые изменения, внесенные в каталог после вилка ()
вызов.

Обратите внимание, что rewinddir () имеет аналогичное ограничение в Windows и не заставляет
readdir () прочитать каталог еще раз. Только недавно открытый каталог
handle будет отражать изменения в каталоге.

Разветвительная труба открытый() еще не реализовано
Конструкции "open (FOO," | - ")" и "open (BAR," - | ")" еще не реализованы.
Это ограничение можно легко обойти в новом коде, создав канал
явно. В следующем примере показано, как писать разветвленному дочернему элементу:

# имитировать открытие (FOO, "| -")
суб Pipe_to_fork ($) {
мой родительский $ = сдвиг;
дай мой $ child, $ parent или умри;
мой $ pid = fork ();
die "fork () не удалось: $!" если не определено $ pid;
if ($ pid) {
закрыть $ child;
}
еще {
закрыть $ parent;
открыть (STDIN, "<& =". fileno ($ child)) или умереть;
}
$ pid;
}

if (pipe_to_fork ('FOO')) {
# родитель
print FOO "pipe_to_fork \ n";
закрыть FOO;
}
еще {
# ребенок
в то время как ( ) { Распечатать; }
выход(0);
}

А этот читает от ребенка:

# имитировать открытие (FOO, "- |")
суб Pipe_from_fork ($) {
мой родительский $ = сдвиг;
pipe $ parent, мой $ child или умри;
мой $ pid = fork ();
die "fork () не удалось: $!" если не определено $ pid;
if ($ pid) {
закрыть $ child;
}
еще {
закрыть $ parent;
открыть (STDOUT, "> & =". fileno ($ child)) или умереть;
}
$ pid;
}

if (pipe_from_fork ('BAR')) {
# родитель
в то время как ( ) { Распечатать; }
закрыть БАР;
}
еще {
# ребенок
напечатать "pipe_from_fork \ n";
выход(0);
}

Разветвительная труба открытый() конструкции будут поддерживаться в будущем.

Глобальное состояние поддерживается XSUB
Внешние подпрограммы (XSUB), которые поддерживают свое собственное глобальное состояние, могут не работать
правильно. Такие XSUB должны либо поддерживать блокировки для защиты одновременных
доступ к глобальным данным из разных псевдопроцессов или поддержание всего их состояния
в таблице символов Perl, которая копируется естественным образом, когда вилка () называется. А
механизм обратного вызова, который предоставляет расширениям возможность клонировать свое состояние
будет предоставлено в ближайшее время.

Интерпретатор, встроенный в более крупное приложение
Команда вилка () эмуляция может вести себя не так, как ожидалось, когда она выполняется в
приложение, которое включает интерпретатор Perl и вызывает API-интерфейсы Perl, которые могут оценивать
бит кода Perl. Это связано с тем, что эмуляция имеет только знания
о собственных структурах данных интерпретатора Perl и ничего не знает о
содержащий состояние приложения. Например, любое государство продолжало
собственный стек вызовов приложения недоступен.

Потоковая безопасность расширений
С вилка () эмуляция запускает код в нескольких потоках, расширения вызывают
небезопасные библиотеки могут работать ненадежно при вызове вилка (). Как Perl's
поддержка потоковой передачи постепенно становится все более распространенной даже на платформах с
родной вилка ()такие расширения, как ожидается, будут исправлены для обеспечения безопасности потоков.

Портативность Пещеры


В переносимом коде Perl нельзя использовать kill (9, $ child) для разветвленных процессов. Убить
разветвленный процесс небезопасен и дает непредсказуемые результаты. Видеть "убийство()", выше.

Используйте perlfork онлайн с помощью сервисов onworks.net


Бесплатные серверы и рабочие станции

Скачать приложения для Windows и Linux

  • 1
    АстрОрзПлеер
    АстрОрзПлеер
    AstrOrz Player — бесплатный медиаплеер.
    программное обеспечение, частично основанное на WMP и VLC.
    плеер выполнен в минималистическом стиле, с
    более десяти цветов темы, а также может
    б ...
    Скачать AstrOrzPlayer
  • 2
    Movistartv
    Movistartv
    Kodi Movistar+ TV является дополнением для XBMC/
    Коди, разрешенный к использованию
    decodificador de los servicios IPTV де
    Movistar интегрирован в один город
    медиацентры ма...
    Скачать киностартв
  • 3
    Code :: Blocks
    Code :: Blocks
    Code::Blocks — это бесплатная программа с открытым исходным кодом,
    кроссплатформенная C, C++ и Fortran IDE
    построен для удовлетворения самых взыскательных потребностей
    своих пользователей. Он разработан, чтобы быть очень
    расширенный ...
    Код загрузки::Блоки
  • 4
    среди
    среди
    Среда или расширенный интерфейс Minecraft
    и отслеживание данных / структуры - это инструмент для
    отобразить обзор Minecraft
    мир, фактически не создавая его. Это
    жестяная банка ...
    Скачать Среди
  • 5
    МСИС2
    МСИС2
    MSYS2 - это набор инструментов и
    библиотеки, предоставляющие вам
    удобная среда для строительства,
    установка и запуск родной Windows
    программное обеспечение. Это кон ...
    Скачать MSYS2
  • 6
    libjpeg-турбо
    libjpeg-турбо
    libjpeg-turbo - это кодек изображений JPEG
    который использует инструкции SIMD (MMX, SSE2,
    NEON, AltiVec) для ускорения базового уровня
    Сжатие и распаковка JPEG на
    x86, x8 ...
    Скачать libjpeg-turbo
  • Больше »

Команды Linux

Ad