Книга: Разработка приложений в среде Linux. Второе издание
10.8. Создание клонов
10.8. Создание клонов
Хотя fork()
является традиционным способом создания новых процессов в Unix, Linux также предлагает системный вызов call()
, позволяющий процессам дублироваться с указанием ресурсов, которые родительский процесс должен разделять со своими потомками.
int clone(int flags);
Это ненамного отличается от fork()
. Единственная разница в наличии параметра flags
. Он должен быть установлен равным сигналу, который посылается родительскому процессу, когда потомок завершает работу (обычно это SIGCHLD
), объединенному логическим "или" с любым сочетанием перечисленных ниже флагов, определенных в <sched.h>
.
CLONE_VM |
Два процесса разделяют пространство виртуальной памяти (включая стек). |
CLONE_FS |
Разделяется информация файловой системы (такая как текущий каталог). |
CLONE_FILES |
Разделяются открытые файлы. |
CLONE_SIGHAND |
Обработчики сигналов разделяются двумя процессами. |
Когда ресурсы разделяется двумя процессами, оба они видят эти ресурсы идентично. Если указан CLONE_SIGHAND
, то когда один процесс заменяет обработчик определенного сигнала, оба начинают использовать новый обработчик (подробности об обработчиках сигналов представлены в главе 12). Когда используется CLONE_FILES
, разделяются не только наборы открытых файлов, но также текущие позиции в каждом файле. Значения возврата для clone()
те же самые, что и у fork()
.
Если для доставки родительскому процессу специфицирован сигнал, отличный от SIGCHLD
, то семейство функций wait()
по умолчанию не будет возвращать информацию об этих процессах. Если вы хотите получать информацию об этих процессах, как и в случае процессов, использующих нормальный механизм SIGCHLD
, то флаг __WCLONE
должен быть объединен с помощью логического "или" с параметром flags
вызова wait()
. Хотя такое поведение может показаться странным, оно обеспечивает большую гибкость. Если бы функция wait()
возвращала информацию о клонированных процессах, было бы сложнее построить стандартные библиотеки потоков вокруг clone()
, потому что wait()
должна возвращать информацию о других потоках, а также о дочерних процессах.
Хотя и не рекомендуется, чтобы приложения непосредственно использовали clone()
, доступно множество библиотек пространства пользователя, которые применяют clone()
и предоставляют полностью POSIX-совместимую реализацию потоков. Библиотека glibc
включает libthread
— наиболее популярную реализацию потоков. Теме программирования потоков POSIX посвящено несколько хороших книг, среди которых [4] и [23].
- Репозитории прямых клонов
- Создание файлов с блокировкой
- Создание свободно позиционируемых элементов
- 12. Лекция: Создание приложений с графическим интерфейсом пользователя.
- Создание объектов Collection
- 7.4.2.4. Создание своего первого LiveCD
- 4.2. Создание трехмерной модели и построение горизонтальной проекции детали
- 7.4.2. Создание собственного LiveCD
- Создание пользователя и группы на рабочей станции
- Создание корня документа:
- Создание многофайловой базы данных
- Создание форм с несколькими вкладками