#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 процесса выполняются параллельно или нет? при написании вашего кода вы сразу же выходите из дочерних процессов.