如果父母需要在两组子进程中执行多个函数,我在尝试包围问题时遇到了一些麻烦。
此代码将执行function()n次
pid_t = pid;
int n; /* number of child processes*/
for (i = 0; i < n; ++i)
{
if ((pid = fork()) < 0)
{
/*error handling*/
}
else if (pid == 0)
{
function();
exit(0);
}
}
/*Parent waits*/
如何使用来自父级的另一组子进程同时执行另一个函数。
1)父分叉n处理所有正在执行的function1()
2)parent也在执行function2()
的其他进程中分叉3)两组子进程执行,而父进程等待所有进程组完成。
答案 0 :(得分:2)
如果您不介意在function1
的任何进程之前fork
获取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();
}
}
}
我省略了错误检查之类的事情,但一般的想法是遍历一组函数并为每个函数分叉所需的次数。