给定一个进程树
A / / BC / / DEFG
我被要求以BFS顺序打印序列,即使用fork()系统调用ABCDEFG,其中每个节点表示一个具有相同父子构造的进程,如树中所示(即A是B和C的父,B是父像D和E那样)。
我想出了这个解决方案,但我真的不明白如何使它以递归方式打印。
static int count; char *msg[] = {"A", "B", "C", "D", "E", "F", "G"}; main(){ if(!fork()){ //Child 1 printf("%stt%dtt%dn", msg[count++], (int)getpid(), (int)getppid()); } else{ if(!fork()){ //Child 2 printf("%stt%dtt%dn", msg[count++], (int)getpid(), (int)getppid()); } } }
这个逻辑只打印ABC,如何使其递归,以便打印到G? 请帮忙。 谢谢。
以下代码执行您需要的操作,但不保证将首先打印哪个叶子(相同级别的打印顺序)。
#include #include #include #include #include typedef struct node { char data; struct node *left; struct node *right; } node; void pretty_print(node *nodes[], int size) { int fork_cnt = 0; for (int i=0; i < size; i++) { if (fork() == 0) { // Child path. printf("%c (pid: %d, parent: %d)n", nodes[i]->data, (int)getpid(), (int)getppid()); node *children_nodes[256]; int children_sizes = 0; if (nodes[i]->left) children_nodes[children_sizes++] = nodes[i]->left; if (nodes[i]->right) children_nodes[children_sizes++] = nodes[i]->right; if (children_sizes) { if (fork() == 0) { pretty_print(children_nodes, children_sizes); return; } } return; } else { // Parent path. fork_cnt++; } } for (int i=0; i < fork_cnt; i++) { // wait all children. int status; wait(&status); } } int main(void) { node g = {'G', NULL, NULL}; node f = {'F', NULL, NULL}; node e = {'E', NULL, NULL}; node d = {'D', NULL, NULL}; node b = {'B', &d, &e}; node c = {'C', &f, &g}; node a = {'A', &b, &c}; node *root[1] = {&a}; pretty_print(root, 1); return 0; }
以上就是c/c++开发分享使用fork()以广度优先顺序打印序列相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549571.html