Внутренняя организация (относительно семейных отношений) процессов в Linux

Эта ошибка может также быть вызвана, если Вы связываетесь с зашифрованной папкой.

6
06.04.2018, 16:20
2 ответа

Ваш беспорядок происходит от смешивания двух вещей: (1) хранение организованных дескрипторов процесса и (2) родительские/дочерние отношения.

Вам не нужны родительские/дочерние отношения для решения, какой процесс выполнить затем, или (в целом) которые обрабатывают для поставки сигнала. Так, Linux task_struct (в котором я нашел linux/sched.h для 3.11.5 источников ядра), имеет:

struct task_struct __rcu *real_parent; /* real parent process */
struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */
/*
 * children/sibling forms the list of my natural children
 */

struct list_head children;  /* list of my children */
struct list_head sibling;   /* linkage in my parent's children list */

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

Знаменитый двунаправленный связанный список не очевиден в 3.11.5 struct task_struct определение структуры. Если я прочитал код правильно, непрокомментированный элемент структуры struct list_head tasks; двунаправленный связанный список "организации", но я мог быть неправым.

5
27.01.2020, 20:23

fork() создает новый процесс путем копирования дескриптора процесса. Следовательно два процесса действительно совместно используют (по крайней мере первоначально) некоторые данные, но как только один процесс начинает изменять их, механизм копии на записи удостоверяются, что изменение локализуется только к процессу, который на самом деле сделал их. Это - стандартный механизм для процесса, мечущего икру на UNIX.

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

6
27.01.2020, 20:23

Теги

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