Как именно работает «fork»

Sergey ShishkinSergey Shishkin
2 min read

Ещё раз акцентируем отдельную функцию, не смотря на пост - fork … *Fork, потому что автором PicoLisp ей посвящена целая статья - How exactly is 'fork' working in the reference example?.

(unless (fork) (do 5 (println 'OK) (wait 1000)) (bye))

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

Функция PicoLisp 'fork' возвращает число (PID дочернего процесса) в родительском процессе и NIL в дочернем процессе. Таким образом, в приведенном выше примере

 (unless (fork)

выполняется в текущем процессе (который впоследствии станет «родительским»), и (fork) возвращает PID дочернего процесса. Это не NIL, поэтому тело вызова «unless» пропускается родителем, и он продолжит выполнение со следующим выражением (здесь не показано).

В дочернем процессе «fork» возвращает NIL, и выполняется тело вызова «unless». Он состоит из двух выражений

   (do 5 (println 'OK) (wait 1000))
   (bye)

Это код, который видит дочерний процесс. Он печатает пять раз «OK», а затем завершает работу (завершая дочерний процесс).

Обратите внимание, что «bye» важно, потому что в противном случае дочерний процесс продолжил бы выполнение следующего (не показанного) выражения, которое уже было выполнено родителем 5 секунд назад.

Таким образом,

   (unless (fork)
      (do-something)
      (bye) )

является типичным шаблоном для выполнения (чего-либо) в дочернем процессе. 'unless' начинает выполнение только в родительском процессе, но после того, как его условие ('fork') оценивается, у нас внезапно появляются два процесса, которые выполняют разные ветви в коде (следующий оператор в родительском процессе и тело 'unless' в дочернем процессе). Вот почему этот системный вызов называется "fork".

Фактически, без комментариев, просто перевод. А это ссылка на все материалы по самому символу, включая глобальную переменную.

https://picolisp.tiddlyhost.com/#fork

0
Subscribe to my newsletter

Read articles from Sergey Shishkin directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Sergey Shishkin
Sergey Shishkin

Всегда чему-то учусь!