c中的叉树取决于具体参数

时间:2015-12-23 16:48:08

标签: c fork

所以我必须用fork创建一个树,然后我需要使用pstree来显示它。 树是基于一些参数的方式,这里是一个选项:2 0 3 0 1 0 3。 含义:原始过程需要分叉2个孩子,左边一个什么都不做,右边一个分叉3个孩子。左边的一个和右边的一个什么都不做,中间的一个分叉过程和那个过程比分叉3个更多的孩子。

这是一个方案:

     o
    / \
   o   o
      /|\
     o o o
       |
       o
      /|\
     o o o

我不知道如何开始这个,我只有这个:(记住我不需要硬编码) 编辑:我不知道如何识别要分叉的孩子。 (我怎么知道那3个中的哪个是中间孩子?)

    char c; int n;
    int *array = (int*)malloc(20*sizeof(int));
    int i = 0;
    //reads the cmdline arguements
    while ((scanf("%d", &n))!=EOF) {
        array[i]=n;
        //printf("%d ", array[i]);
        i++;
    }
    //gets pid of original process and makes a string to call pstree
    int d=getpid();
    char str[50] = "pstree -c ";
    char str1[20];
    sprintf(str1, "%d", d);
    strcat(str,str1);

1 个答案:

答案 0 :(得分:1)

差不多有一天,不确定评论是否有用 这是一个建议的实现 - 我知道你想先尝试自己做,所以,首先是提示。如果您需要一些线索,请查看底部的C程序。

假设:

  • 字符串由多个数字组成,每个数字至少由一个空格分隔。
  • 在字符串结束后,指令相当于" 0 fork"
  • 限制(在底部)。

首先,您可能会注意到一个递归模式(但同样的算法可能也会以迭代方式开发)

  • 分叉n次
  • 要求孩子1 .. n分叉x1 .. xn次,同时用下一次操作喂它们
  • 每个孩子重复相同的算法

<强>提示

  • 创建两个函数,一个用于到达字符串中的下一个数字,一个用于跳过字符串中的n个数字
  • 创建一个带有2个参数的递归函数
    • 要执行的货叉数量
    • 字符串的一部分,为该特定孩子的下一个叉子(如果有的话)提供指示(在所有孩子中,只有一个应该再次)
  • 如果不执行fork,则该函数只需等待一分钟
  • 如果必须执行N个叉子,
    • 在跳过 调用的所有孩子之后得到一个指向该字符串的S(例如&#34; 2 0 3 4 0 0&#34;分叉两次,0和3是儿童要完成的叉子数量,第二个孩子得到的S指向&#34; 4 0 0&#34;)。
    • 做N个叉子,孩子们用参数递归调用函数(例如2个叉子的相同例子0和3)
    • 子方面,在递归通话后返回
    • 父进程( this one)每次使S指向下一个数字,仅当子进程创建至少一个fork时。
  • 终于等待上面创建的所有流程

那就是它。

限制:此处建议的算法假设操作字符串每组叉子只生成一个活动分支 - 您提供的字符串&#34; 2 0 3 0 1 0 3&#34;按照那个限制去做(否则算法会更难;例如用&#34; 2 2 3 ......&#34;你有2个平行的活动分支,它们有自己的生命,必须是从字符串中提取!意味着在字符串中搜索哪个部分要给深度D fork F ...)。

你应该得到类似的东西(是的,我的编程名称是&#34; x&#34;),通过pstree -c可见约一分钟

-bash───x─┬─x
          └─x─┬─x
              ├─x───x─┬─x
              │       ├─x
              │       └─x
              └─x

实施建议

  • 首先是2个辅助函数

要到达下一个数字(或0,即&#39; \ 0&#39;)是字符串

char *nextdigit(char *s) {
    while (*s && (*s<'0' || *s>'9')) s++; // skip non digits
    return s;
}

跳过n位

char *skipndigits(int n, char *s) {
    while (n--) {
        s = nextdigit(s);
        if (*s) s++;
    }
    return s;
}

接下来是如何调用递归函数(例如从 main()),使用 forkering()函数的名称

char *op = "2 0 3 0 1 0 3";

forkering(atoi(op), op+1);

最后是递归函数。

#define WAITING 60

void forkering(int n, char *op) {
    printf("forkering %d, with %s\n", n, op);

    if ( ! n) {
        sleep(WAITING); // no forking, wait WAITING seconds
        return;
    }

    char *nextop = skipndigits(n, op); // next op (for children)

    while(n--) {
        op = nextdigit(op);
        int nop = atoi(op);  // number of forks that child has to do
        if ( ! fork()) {
            forkering(nop, nextop);
            return;
        }
        if (nop) nextop = skipndigits(1, nextop); // only skip if non zero
        op = skipndigits(1, op); // for our children
    }

    while (wait(NULL) > 0); // wait all processes created above
}

正如您所看到的,功能很短。