所以我必须用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);
答案 0 :(得分:1)
差不多有一天,不确定评论是否有用 这是一个建议的实现 - 我知道你想先尝试自己做,所以,首先是提示。如果您需要一些线索,请查看底部的C程序。
假设:
首先,您可能会注意到一个递归模式(但同样的算法可能也会以迭代方式开发)
<强>提示强>
那就是它。
限制:此处建议的算法假设操作字符串每组叉子只生成一个活动分支 - 您提供的字符串&#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
实施建议
要到达下一个数字(或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
}
正如您所看到的,功能很短。