Это заслуживает некоторого объяснения.И это просто, как дождь.
Учитывайте это.Программа должна делать некоторые вещи одновременно.Скажем, ваша программа печатает «Здравствуй, мир!» Каждую секунду, пока кто-нибудь не введет «Здравствуй, Майк», а затем каждую секунду печатает эту строку, ожидая, когда Джон изменит ее в будущем.
Как вы пишете это стандартным способом?В вашей программе, которая в основном выводит «привет», вы должны создать другую ветвь, которая ожидает ввода данных пользователем.
Вы создаете два процесса, один , выводящих эти строкии еще один, ожидающий пользовательский ввод.И только способ создания нового процесса в UNIX вызывал системный вызов fork (), например:
ret = fork();
if(ret > 0) /* parent, continue waiting */
else /* child */
Эта схема создала множество проблем.Пользователь вводит «Майк», но у вас нет простого способа передать эту строку родительскому процессу, чтобы он мог ее распечатать, потому что + каждый + процесс имеет свое собственное представление о памяти, которое не используется совместно с дочерним процессом.
Когда процессы создаются с помощью fork (), каждый из них получает копию памяти , существующей в этот момент, и если эта память действительно изменяется позже отображение, идентичное для этих сегментов памяти, будет сразу же изменено (это называется механизмом копирования при записи).
Еще одна вещь, которую нужно разделить между дочерним элементома родителем являются, например, дескрипторы открытых файлов, дескрипторы разделяемой памяти, входные / выходные данные и т. д., которые также не сохранятся после fork ().
Итак.Сам вызов fork () должен был облегчить , включая общую память / сигналы и т. Д. Но как?Это была идея клона ().Этот вызов принимает флаг, указывающий , что именно вы бы поделились с ребенком.Например, память, обработчики сигналов и т. Д. И если вы вызовете это с флагом = 0, это будет идентично для fork (), с точностью до аргументов, которые они принимают.И когда создаются Pthread-файлы POSIX, этот флаг будет отражать атрибуты, которые вы указали в pthread_attr.
С точки зрения ядра, нет никакой разницы между процессами, созданными таким образом, и никакой особой семантики, чтобы различать "ПРОЦЕССЫ».Ядро даже не знает, что это за «поток», он создает новый процесс, но он просто объединяет его как ведущий к той группе процессов , у которой был родитель, который вызвал егозаботясь о том, что может сделать этот процесс.Таким образом, у вас есть разные процессы (которые имеют один и тот же pid), объединенные в группу процессов , каждый из которых назначен с другим «TID» (который начинается с PID родителя).Не забудьте объяснить, что clone () делает именно это.Вы можете передать это whaterver , в котором вы нуждаетесь (на самом деле старый вызов vfork () подойдет).Собираетесь ли вы поделиться памятью?Hanlers?Вы можете настроить все, просто убедитесь, что вы не конфликтуете с библиотекой pthreads, написанной сразу же после этого вызова.Важно то, что версия ядра довольно возмутительна, она ожидает, что будут переданы только 2 из 4 параметров, пользовательский стек и параметры.