NPM :Неудовлетворенные зависимости от Debian 9.13 Stretch

Когда вы вызываете vfork(), создается новый процесс, и этот новый процесс заимствует образ процесса родительского процесса, за исключением стека. Дочернему процессу дается собственная новая звезда стека, однако он не позволяет returnиз функции, вызвавшей vfork().

Пока работает дочерний процесс, родительский процесс блокируется, так как дочерний процесс заимствовал адресное пространство родителя.

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

Вещи, которые изменяют глобальные данные, например.:

  • вызов malloc ()или свободный()

  • с использованием стандартного ввода

  • изменение настроек сигнала

  • изменение переменных, не являющихся локальными для функции, вызвавшей vfork().

  • ...

Как только вы назовете_exit()(важным, никогда не вызывайте exit()), дочерний процесс завершается, а управление возвращается родителю.

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

Управление возвращается родительскому процессу, так как его адресное пространство больше не используется другим процессом.

Важно! :В Linux нет настоящей vfork()реализации. Linux скорее реализует vfork()на основе концепции копирования при записи fork(), представленной SunOS -4.0 в 1988 году. Чтобы пользователи поверили, что они используют vfork(),Linux просто устанавливает общие данные и приостанавливает родительский процесс, пока дочерний не вызывает _exit()или одну из функций exec*().

Таким образом, Linux не выигрывает от того факта, что настоящему vfork()не нужно устанавливать описание адресного пространства для дочернего элемента в ядре. Это приводит к vfork(), который не быстрее, чем fork(). В системах, реализующих настоящий vfork(), он обычно в 3 раза быстрее, чем fork(), и влияет на производительность оболочек, использующих vfork()-ksh93, последние Bourne Shellи csh.

Причина, по которой вы никогда не должны вызывать exit()из дочернего элемента vfork()ed, заключается в том, что exit()сбрасывает stdio в случае, если есть несброшенные данные за время, предшествующее вызову vfork(). Это может привести к странным результатам.

Кстати,:posix_spawn()реализован поверх vfork(), поэтому vfork()не будет удален из ОС. Было упомянуто, что Linux не использует vfork()вместо posix_spawn().

Документации по стеку немного, вот что написано на справочной странице Solaris:

 The vfork() and vforkx() functions can normally be used  the
 same  way  as  fork() and forkx(), respectively. The calling
 procedure, however, should not return while running  in  the
 child's  context,  since the eventual return from vfork() or
 vforkx() in the parent would be to a  stack  frame  that  no
 longer  exists. 

Таким образом, реализация может делать все, что ей нравится. Реализация Solaris использует разделяемую память для кадра стека вызова функции vfork(). Никакая реализация не предоставляет доступ к более старым частям стека от родителя.

0
07.01.2021, 09:09
1 ответ

узел доступен какsnap:

sudo apt install snapd 
sudo snap refresh node --channel=15
sudo snap install node --classic --channel=15

А также имеет отдельный репозиторий; используя скрипт установки :

curl -sL https://deb.nodesource.com/setup_15.x | sudo bash -
sudo apt-get install -y nodejs
2
18.03.2021, 22:37

Теги

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