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

Ещё раз акцентируем отдельную функцию, не смотря на пост - 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".
Фактически, без комментариев, просто перевод. А это ссылка на все материалы по самому символу, включая глобальную переменную.
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
Всегда чему-то учусь!