gpt4 book ai didi

c - 在 C 中使用 Fork 的递归斐波那契数列(第 2 部分)

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:19 24 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数使用 C 中的 fork 递归地计算来自给定 int n 的结果斐波那契数。

函数说明如下: 如果 doPrint 为真,则打印它。否则,将其提供给父进程。该解决方案应该是递归的,并且它必须为每次调用派生一个新的 child 。每个进程都应该恰好调用 doFib() 一次。方法签名无法更改。无法使用辅助函数。

这是这个问题的延续:Recursive Fibonacci using Fork (in C)

不幸的是,我从来没有想出解决上一篇文章中的问题的方法,但这是我修改后的代码。我以为我已经弄明白了(明智的伪代码),但后来发现我仍然不确定一些部分。

在这一点上,这仅供我娱乐。这不是家庭作业,也不会再出现在我的类里面(在最近的测试通过后)。

static pid_t root_pid;

// Function to return exit code for PID
static int exitcode(pid_t pid)
{
pid_t retpid;
int status;

retpid = waitpid(pid, &status, 0);
if (pid != retpid)
{
printf("waitpid error\n");
}

return WEXITSTATUS(status);
}

static void doFib(int n, int doPrint)
{
root_pid = getpid();

pid_t pid1;
int status1;

pid_t pid2;
int status2;

if(n < 2) // Base case, exit back to parent?
{
exit(n);
}
else // if not base case, fork child processes
{
pid1 = fork();
if (pid1 == 0) // Child Process 1 (for fib(n-1))
{
doFib(n-1, doPrint);
exit(n-1);
}
else if (pid1 > 0) // Parent Process
{
pid2 = fork();
if (pid2 == 0) // Child Process 2 (for fib(n-2))
{
doFib(n-2, doPrint);
exit(n-2);
}

// Get value from child process 1
status1 = exitcode(pid1);
// Get value from child process 2
status2 = exitcode(pid2);

// When to print?
if (getpid() == root_pid)
{
int result = status1 + status2;
if (doPrint)
{
printf("%d\n", result);
}
else
{
exit(result);
}
}
}
}
}

几个问题...

  1. 我是否需要为每个子进程调用这两个函数?

    doFib(n-1, doPrint); exit(n-1);
  2. 一开始我的基本情况是否正确? (n < 2)
  3. 最后我的基本情况是否正确? (何时打印)

感谢您的帮助。

最佳答案

“何时打印”的答案实际上取决于您要打印的内容……如果您只想打印最终答案,那么您很可能需要一个标志来指示您何时在root 父进程,并使用 if 语句来测试您是否确实是 root 父进程,以便您只打印一个数字。另一方面,如果您想打印整个序列直到最后的数字,则不需要 if 语句。

例如,一个好的标志值应该是根进程的 PID。在开始 fork 单独的子进程之前,您可以将其保存在 main() 的前几行中名为 root_pid 的全局变量中。这样所有子进程都将为 root_pid 设置相同的值,if 语句可以简单地为 if (getpid() == root_pid).

所以做这样的事情:

//fib.c
#include <unistd.h>
pid_t root_pid

int main()
{
root_pid = getpid();

//... rest of your program

}

并且如上所述,在 doFib 中使您的 if 语句如下:

if (getpid() == root_pid)
{
//...print results
}
else
{
exit(result)
}

关于c - 在 C 中使用 Fork 的递归斐波那契数列(第 2 部分),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9311999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com