Дочерний процесс будет иметь единственный потокработает в контексте вызывающего потока.Другие части исходного процесса могут быть связаны нитями, которые больше не существуют (например, мьютексы могут быть заблокированы).
Есть две причины, по которым программисты POSIX вызывают fork()
.Одной из причин является создание нового потока управления в той же программе (что первоначально было возможно только в POSIX путем создания нового процесса);другой - создать новый процесс, на котором запущена другая программа.В последнем случае после вызова fork()
вскоре следует вызов одной из exec
функций.
Общая проблема с fork()
работой в многопоточном мире заключается в том, чтоделать со всеми потоками.Есть две альтернативы.Одним из них является копирование всех потоков в новый процесс.Это заставляет программиста или реализацию иметь дело с потоками, которые приостановлены на системные вызовы или могут выполнять системные вызовы, которые не должны выполняться в новом процессе.Другой альтернативой является копирование только потока, который вызывает fork()
.Это создает сложность в том, что состояние локальных ресурсов процесса обычно хранится в памяти процесса.Если поток, который не вызывает fork()
, содержит ресурс, этот ресурс никогда не освобождается в дочернем процессе, потому что поток, задачей которого является освобождение ресурса, не существует в дочернем процессе.
КогдаПрограммист пишет многопоточную программу, первое описанное использование fork()
, создание новых потоков в той же программе, обеспечивается функцией pthread_create()
.Таким образом, функция fork()
используется только для запуска новых программ, а эффекты вызова функций, которые требуют определенных ресурсов между вызовом fork()
и вызовом функции exec, не определены.