使用多种功能的多处理叉

时间:2018-05-03 12:53:25

标签: c fork

如果父母需要在两组子进程中执行多个函数,我在尝试包围问题时遇到了一些麻烦。

此代码将执行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)两组子进程执行,而父进程等待所有进程组完成。

1 个答案:

答案 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();
         }
    }
}

我省略了错误检查之类的事情,但一般的想法是遍历一组函数并为每个函数分叉所需的次数。