我正在尝试使用 fork 和 exec 逐级执行节点的有向图-即,如果节点 1 和 2 都是节点 0 的子节点,则它们必须等待 0 完成后再执行,因为它们取决于输出节点 0 的执行;如果节点 4 是 2 和 3 的子节点,它必须等待 2 和 3 完成,依此类推。我的节点结构定义如下:
#define MAX_LEN 1024
#define MAX_CHILD_NBR 10
#define MAX_NODE_NBR 50
typedef struct node {
int id;
char program[MAX_LEN];
char prog_input[MAX_LEN];
char prog_output[MAX_LEN];
int child_list[MAX_CHILD_NBR];
int child_nbr;
int status; //0-ineligible; 1-ready; 2-running; 3-finished
pid_t pid;
} node_t;
我不确定如何使用 fork 和 exec 以正确的顺序执行这些程序,并且想知道是否有人可以帮助我了解如何执行此操作的总体大纲/结构?
我认为 fork()s 必须处于某种循环中,但我的困惑在于如何以正确的方式循环和等待;到目前为止,我最好的想法是:
void executeGraph(struct node_t* headNode) {
int i;
for (i=0; i < headNode->child_nbr; i++) {
int pid = fork();
if (pid == 0) {
//this is the parent proc, but what should I do with it?
}
elseif (pid > 0) {
//this is the "child" proc, but how should I continue from here?
}
...
}
我觉得这个想法似乎是不正确的(或者至少遗漏了一些东西),但我只是不确定如何遍历这样的图表,所以如果有人可以就如何处理或如何处理提供任何输入或建议fork() 以有序的方式,我将不胜感激!我认为我的困惑在于跟踪关于图表的哪个过程..有什么帮助吗?