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