xv6下使用fork构建链式父子进程以测试ps功能的实现咨询
xv6链式父子进程实现方法
核心逻辑
和你之前实现的单父进程多子进程逻辑相反,链式创建的核心是只有新生成的子进程才会执行下一次fork操作,父进程创建完1个子进程后就终止创建流程,自然就形成逐代传递的链式进程结构。
参考伪代码
设置总进程数 = 8 当前层级 = 0 根进程PID = 取当前进程ID 循环 当 当前层级 < 总进程数 - 1: pid = fork() 如果 pid == 0: // 当前是新创建的子进程 当前层级 = 当前层级 + 1 睡眠20个时间单位 // 保持进程活跃,方便ps统计 否则: // 当前是父进程,不需要再创建新进程 跳出循环 如果 当前进程ID == 根进程PID: 调用ps() 等待所有子进程运行结束 进程退出
xv6下可直接运行的C代码
int main(void) { int root_pid = getpid(); int level = 0; const int TOTAL_PROCS = 8; while (level < TOTAL_PROCS - 1) { int pid = fork(); if (pid < 0) { printf("fork error\n"); exit(); } if (pid == 0) { level++; sleep(20); } else { break; } } if (getpid() == root_pid) { ps(); } while(wait() != -1); exit(); }
运行效果说明
执行后ps输出的进程会呈现链式父子关系,比如根进程PID为3,那么下一级子进程PPID为3,再下一级子进程的PPID为上一级子进程的PID,依次类推共8个进程串成一条链,符合测试要求。
内容的提问来源于stack exchange,提问作者Relby Bry
相关产品推荐
相关产品推荐

