Параллельные процессы в C

#c #fork

#c #разветвление

Вопрос:

Как я могу запустить 3 процесса параллельно? Правильно ли приведенное ниже решение? В моем решении я ввел некоторый код, чтобы увидеть прошедшее время, и я думаю, что это настройка в последовательном режиме. Мне нужно запустить pid1, pid2 и pid3 одновременно.

 pid = fork();
if(pid == 0) {
        //code...
    exit(EXIT_SUCCESS);
} else if(pid > 0) {
        pid1 = fork();
        if(pid1 == 0) {
                //pid1 code...
            exit(EXIT_SUCCESS);
    } else if(pid1 > 0) {
            waitpid(pid1, amp;status, 0);
    } else {
        printf("Fork error %d.n", errno);
    }

    pid2 = fork();
    if(pid2 == 0) {
                //pid2 code...
        exit(EXIT_SUCCESS);
    } else if(pid2 > 0) {
        waitpid(pid2, amp;status, 0);
    } else {
        printf("Fork error %d.n", errno);
    }

    pid3 = fork();
    if(pid3 == 0) {
                //pid3 code...
                exit(EXIT_SUCCESS);
    } else if(pid3 > 0) {
        waitpid(pid3, amp;status, 0);
    } else {
            printf("Fork error %d.n", errno);
    }
        waitpid(pid, amp;status, 0);
}
  

Комментарии:

1. Одно замечание: количество параллельных процессов, которые вы можете создать, не имеет ничего общего с языком C. Это контролируется вашей операционной системой, а в любой современной операционной системе количество поддерживаемых параллельных процессов исчисляется тысячами.

Ответ №1:

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

 for (int i = 0; i < 3;   i)
{
    pid = fork();

    if (pid < 0)
        error

    if (pid == 0)
    {
        child does thing
        exit
    }
}

for (int i = 0; i < 3;   i)
{
    wait(amp;status);
}
  

Редактировать

Поэтому просто измените свой код на что-то вроде этого и дождитесь окончания.

     if (pid2 == 0)
    {
        //pid2 code...
        exit(EXIT_SUCCESS);
    }
    else
        if (pid2 < 0)
        {
            printf("Fork error %d.n", errno);
        }

   //....same outline for 3, etc.
  

Комментарии:

1. Хммм, хорошо. Но в этом решении я не могу отличить дочерние, верно? Я имею в виду, что мои 3 процесса должны выполнять разный код… В вашем решении они будут делать то же самое, верно?

2. Да, но вам не обязательно делать это в цикле. У вас может быть три отдельных форка, в каждом из которых дочерний элемент выполняет разный код, но не ждите завершения каждого из них, прежде чем продолжить в родительском, если вы хотите, чтобы он выполнялся параллельно. Если важно различать дочерние pid-коды, поместите их в массив или список и ожидайте их после создания всех дочерних элементов.

3. Теперь я остаюсь с процессами в оболочке (запущенными, я думаю). Потому что с помощью wait () он ожидает только одного из процессов, верно? Другие остаются там…

4. Я не уверен, что понимаю, о чем вы спрашиваете. Здесь не задействована оболочка. Дочерние элементы завершат работу самостоятельно. Операционная система будет хранить информацию о дочерних процессах до тех пор, пока вы не соберете их с помощью wait(). Вы можете собирать их все в цикле по мере их завершения, один за другим. Все, что делает wait() (обычно), это блокирует, пока дочерний процесс не будет завершен, чтобы родитель мог изучить информацию о статусе возврата.

Ответ №2:

Ознакомьтесь с моей программой переноса, в частности с кодом для wrapc . Он дважды разветвляется, запускает один дочерний процесс в wrap , считывает, записывает в wrap , затем выполняет обратное чтение в другом дочернем процессе.

Ответ №3:

Ваш вопрос несколько расплывчатый — вы видите, что 3 процесса выполняются параллельно или нет? при написании вашего кода вы сразу же выходите из дочерних процессов.