Как создать несколько процессов потомков от одного родителя и запустить их параллельно?
Пытаюсь понять как рождаются процессы от родителя через fork. Накидал вот такой вот код.
int i;
int it;
pid_t pid[10];
pid[0] = fork();
printf("Parent I:%d\n",getpid());
for(i = 1; i<=5; i++)
{
pid[i] = fork();
sleep(1 + rand() % 5);
if (pid[i] ==0){
printf("CHILD I:%d \n", i);
exit(0);
}
else{
wait(&ut);
}
}
return 0;
}
В выводе у меня принтуется PID родителя(возможно это вообще не нужно и неправильно), и после вызывается последовательно 5 потомков:
CHILD I:1
CHILD I:2
CHILD I:3
CHILD I:4
CHILD I:5
Вопрос, правильно ли я вообще запустил процесс наследования от одного родителя и как запустить эти процессы параллельно с задержкой, например:
CHILD I:5
CHILD I:4
CHILD I:1
CHILD I:2
CHILD I:3
Вроде получилось сделать как нужно, но все еще есть сомнения по поводу асинхронных выполнений процессов
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
int main() {
FILE *inputFile;
inputFile = fopen("in.txt", "r");
char charsArray[128];
int i;
int it;
int t;
pid_t pid[10];
printf("Parent I:%d\n",getppid());
printf("__________\n");
srand(time(NULL));
if (inputFile == NULL) {
perror("Error while opening file");
}
else {
for(i = 1; i<=10; i++)
{
t = 1 + rand() % 7;
pid[i] = fork();
if (pid[i] ==0){
sleep(t);
printf("CHILD I:%d Time: %d\n", i, t);
exit(0);
}
}
wait(&it);
sleep(7);
fclose(inputFile);
}
return 0;
}
Вот вывод:
Parent I:3696
__________
CHILD I:1 Time: 1
CHILD I:6 Time: 1
CHILD I:7 Time: 1
CHILD I:3 Time: 2
CHILD I:2 Time: 3
CHILD I:8 Time: 3
CHILD I:10 Time: 4
CHILD I:4 Time: 5
CHILD I:5 Time: 6
CHILD I:9 Time: 7
Ответы (1 шт):
Код не компилируется, но выглядит похожим на правду. Только вы запускаете процессы последовательно, потому что ждёте завершения одного ребёнка прежде чем запустить следующего. Запускать и ждать надо в разных циклах:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#define N 5
void child(int i) {
for (int j = 0; j < 5; ++j) {
printf("child %d(%d): %d\n", i, (int)getpid(), j);
sleep(1);
}
}
int main() {
pid_t pids[N];
puts("parent start");
for (int i = 0; i < N; ++i) {
int pid = fork();
if (pid == 0) {
child(i);
exit(0);
} else {
pids[i] = pid;
}
}
puts("parent wait");
for (int i = 0; i < N; ++i) {
if (pids[i] > 0) {
waitpid(pids[i], NULL, 0);
}
}
puts("parent stop");
}
$ gcc -std=c11 -pedantic -Wall -Wextra -Werror temp.c $./a.out parent start child 0(14003): 0 parent wait child 3(14006): 0 child 2(14005): 0 child 4(14007): 0 child 1(14004): 0 child 0(14003): 1 child 2(14005): 1 child 3(14006): 1 child 4(14007): 1 child 1(14004): 1 child 0(14003): 2 child 3(14006): 2 child 4(14007): 2 child 2(14005): 2 child 1(14004): 2 child 0(14003): 3 child 3(14006): 3 child 4(14007): 3 child 2(14005): 3 child 1(14004): 3 child 0(14003): 4 child 3(14006): 4 child 4(14007): 4 child 2(14005): 4 child 1(14004): 4 parent stop