Как обработать ошибку форка для многопоточного процесса? - PullRequest
1 голос
/ 20 февраля 2012

Я работаю над многопоточным процессом, который разветвляется для выполнения другого процесса. Иногда ответвление может привести к ошибке, если исполняемый файл не существует. Так как этот процесс имеет несколько потоков, запущенных до fork, у меня есть пара вопросов:

  1. Копируются ли потоки в разветвленный процесс.
  2. Какова лучшая практика для обработки ошибки из fork с многопоточным процессом. Например:

    /* in a multithreaded process */
    
    
    pid = fork();
    
    if(pid == 0)
    {
    
        execlp(filename, filename, NULL);
    
        fprintf(stderr, "filename doesn't exist");
    
        /* what do i do here if there's multiple threads running
        from the fork? */
    
        exit(-1);
    }
    

1 Ответ

4 голосов
/ 20 февраля 2012

Ну, fork не выдает ошибку, если исполняемый файл не существует.exec ошибки в этом случае.Но, на ваш актуальный вопрос, POSIX утверждает, что fork создает новый процесс с одиночным потоком, копию потока, который вызвал fork.См. здесь для деталей:

Процесс должен быть создан с одним потоком.Если многопоточный процесс вызывает fork (), новый процесс должен содержать реплику вызывающего потока и всего его адресного пространства, возможно, включая состояния мьютексов и других ресурсов.

Следовательно, чтобы избежать ошибок,дочерний процесс может выполнять только асинхронно безопасные операции до тех пор, пока не будет вызвана одна из функций exec.

Так что у вас все в порядке, если немного разрежено: -)

В дочернем процессоре будет запущен один поток, и, если вы не можете exec другой программе, зарегистрировать сообщение и выйти.

И в разделе обоснования объясняется, почему это было сделано именно таким образом.:

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

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

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

...