View in Telegram
⌨️ Как они размножаются? fork()/clone() exec() #process_management Итак, мы погружаемся в жизнь процессов всё глубже и глубже, и настало время узнать, откуда берутся новые процессы. Чтобы создать новый процесс, существующий процесс использует системный вызов fork() (технически в Linux используется вызов clone(), но для удобства повествования пока пропустим это). В результате выполнения fork() мы получаем два почти идентичных процесса, с одним важным исключением: системный вызов fork() возвращает два разных значения. В дочернем процессе это значение равно 0 (всегда помним, что согласно Linux-нумерологии 0 обозначает успех), а в родительском процессе возвращается идентификатор PID процесса-потомка. Поскольку в остальном процессы идентичны, они должны проверить это значение, чтобы определить, кто из них родитель, а кто потомок, и, исходя из этой информации, планировать дальнейшие действия. В жизни родительского процесса мало что изменится, кроме новой ответственности за процесс-потомка, тогда как дочерний процесс изменится кардинально, выполнив один из вызовов exec (например, execl, execp, execv). Все вызовы этого семейства заменяют текущую программу в процессе, и вся память, связанная с текущим процессом, сбрасывается и перенастраивается в соответствии с требованиями нового исполняемого файла. И вот перед нами свежерожденный потомок, скорее всего он будет абсолютно не походить на своего предка, но кое-что он от него всё-таки унаследует, но об этом чуть позже и чуть ниже.
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram Center
Telegram Center
Channel