Если вы не возражаете против всех процессов для function1
получения fork
'd перед любым из процессов для function2
, вы можете просто использовать последовательные циклы:
pid_t pid;
int n, m;
// Create n processes running function1
for (int i = 0; i < n; i++) {
if (fork() == 0) {
function1();
exit();
}
}
// Create m processes to run function2
for (int i = 0; i < m; i++) {
if (fork() == 0) {
function2();
exit();
}
}
// Parent waits
Но это не масштабируется, если вы хотите запустить n
различных функций.
Масштабируемый ответ будет состоять в том, чтобы использовать массив указателей на функции в сочетании с массивом, содержащим количество повторений выполнения каждой функции.
#define LEN 3
void func1();
void func2();
void func3();
/* f is an array of pointers to each function */
void (*f[LEN])() = {func1, func2, func3};
/* count contains the number of times each function should be called */
int count[LEN] = { 1 , 2 , 3 };
for (int i = 0; i < LEN; i++) {
for (int j = 0; j < counts[i]; j++) {
if (fork() == 0) {
f[i](); // Call function
exit();
}
}
}
Я пропустил такие вещи, как проверка ошибок, но общая идея состоит в том, чтобы зациклить массив функций и разветвлять требуемое количество раз для каждой функции.