【问题标题】:Recursive Fibonacci using Fork (in C)使用 Fork 的递归斐波那契 (C)
【发布时间】:2012-02-06 15:39:54
【问题描述】:

我正在尝试编写一个函数,该函数使用 C 中的 forks 从给定的 int n 递归计算得到的斐波那契数。

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

这是我迄今为止根据我对 fork 的理解所写的内容。我试图分叉两次,这样我就可以产生两个子进程。一个做fib(n-1),一个做fib(n-2)。这样我就可以获取两个结果并将它们组合起来。

static void doFib(int n, int doPrint)
{
    pid_t pid1;
    pid_t retpid1;
    int status1;

    pid_t pid2;
    pid_t retpid2;
    int status2;

    pid = fork();
    if (pid == 0) // Child Process 1
    {
        exit(100); // sends 100 to the parent
    } 
    else if (pid > 0) // Parent Process 1
    {
        pid2 = fork();
        if (pid2 == 0) // Child Process 2
        {
            exit(200); // sends 200 to the parent
        }
        else if (pid2 > 0) // Parent Process 1
        {

        }

        retpid = waitpid(pid,&status,0);
        if (pid != retpid)
        {
            printf("waitpid error\n");
        }
        printf("I got this value from my child process 1: %d\n", WEXITSTATUS(status));
    } 
}

我的问题:

1.如何从两个子进程中获取两个退出值?我知道如何抓住一个(见代码),但我如何抓住他们两个?

2.由于 doFib 不返回值,我如何在我的任何一个子进程中获取我的 doFib 调用的值,以便将它们组合起来?

3.我的分叉是否正确?我对一把叉子很有信心,两把让我头疼。

这是我目前正在为即将到来的考试做准备的一系列练习中期问题。

【问题讨论】:

  • 这是作业吗?那么请标记它。
  • 其实不是功课。这是我为准备期中考试而自愿解决的一系列问题中的一个问题。他们没有到期或以任何方式上交。
  • +1 以抵消反对票。合理的问题,这不是家庭作业。
  • @Zeychin:非常感谢!不想因为不正当的原因而被否决。 ://
  • 这是一个有趣的练习。这是implementation in Python

标签: c recursion fork fibonacci


【解决方案1】:

1) 拨打waitpid 两次。

2) waitpid 调用会将其放入 status

3) 两件事:首先,要终止一个分叉的进程,使用_exit,而不是exitexit 函数可能会弄乱父级仍在使用的文件描述符。对你来说没关系,但为什么要学习坏习惯呢?其次,您不需要else if (pid2 > 0) 子句。就剩下这些了。

【讨论】:

  • 我认为很可能只是调用了两次 waitpid,感谢您澄清这一点。我确实理解 waitpid 调用将我给 _exit() 的任何退出值放入状态,但是如果函数没有,我如何获得 doFib(n-1) 的值(例如,如果它在第一个孩子中被调用)返回一个值?我应该给 _exit() 什么?
  • 您将值赋给_exit。您计算它,然后在获得值后立即致电_exit。您永远不需要在任何地方归还它,因为所有这些工作都在 doFib 内部进行。
  • 啊。我想我现在明白了。因此,基本上在子进程中返回值 (n-1) 和 (n-2),并在最后将这些值相加并打印。该功能将负责其余的工作。对吗?
  • @CODE 这听起来对我来说是正确的,尽管最后一部分让我害怕。所有这些逻辑都发生在函数中。
  • 我也害怕,呵呵。我会玩它,我相信多亏了你,我会相对快速地让它工作。非常感谢。问题系列的其余部分都是这样格式化的,我一直在摸索,想知道如果没有函数返回值,这些是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 2010-12-03
  • 2019-01-21
  • 2014-04-02
  • 2016-07-01
  • 1970-01-01
相关资源
最近更新 更多