gpt4 book ai didi

c - 使用 fork() 显示进程树

转载 作者:行者123 更新时间:2023-11-30 18:43:47 25 4
gpt4 key购买 nike

我需要创建一个进程树并在类似于此的图表中显示父进程和子进程:

this

但是我的结果看起来更像下图:

我不确定我做错了什么,这是我的代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void){

int i, status;
printf( "Enter a value for n :");
int n;
scanf("%d", &n);

FILE *file;
file = fopen("./digraph.txt", "w+"); //my output file
fprintf(file, "digraph {\n");
for (i=0; i<n; i++){

fflush(file);
int pid = fork();

if (pid == 0) {//child

if(i == 0) { //first level
fprintf(file, " \"%d\" [ label=\"pid %d, level %d\" ];\n", getppid(), getppid(), i, file);
fprintf(file, " \"%d\" [ label=\"pid %d, level %d\" ];\n", getpid(), getpid(), i +1, file);
fprintf(file, " \"%d\" -> \"%d\";\n", getppid(), getpid(), file);
}else{
fprintf(file, " \"%d\" [ label=\"pid %d, level %d\" ];\n", getpid(), getpid(), i , file);
fprintf(file, " \"%d\" -> \"%d\";\n", getppid(), getpid(), file);
}
}
else {
pid = waitpid(-1, &status, 0);
break;
}
}
if (i>n){
fprintf(file, "}");
fclose(file);
}
}

最佳答案

正如我所说...在新创建的子进程中,每次迭代只需 fork() 一次。所以你不能真正期待树状 View ,对吧?

为了实现这一点,您可能需要在循环中进行类似的操作:

for (i=0; i<n; i++){
fflush(file);
pid_l = fork();

if (pid_l == 0) { //left child
if(i == 0) { //first level
fprintf(file, " \"%d\" [ label=\"pid %d, level %d\" ];\n", getppid(), getppid(), i);
fprintf(file, " \"%d\" [ label=\"pid %d, level %d\" ];\n", getpid(), getpid(), i + 1);
fprintf(file, " \"%d\" -> \"%d\";\n", getppid(), getpid());
}else{
fprintf(file, " \"%d\" [ label=\"pid %d, level %d\" ];\n", getpid(), getpid(), i + 1);
fprintf(file, " \"%d\" -> \"%d\";\n", getppid(), getpid());
}
return 0;
}
else {
printf("parent: %d left child: %d\n", getpid(), pid_l);
pid_r = waitpid(-1, &status, 0);
}

pid_r = fork();

if (pid_r == 0) { //right child
if(i == 0) { //first level
fprintf(file, " \"%d\" [ label=\"pid %d, level %d\" ];\n", getppid(), getppid(), i);
fprintf(file, " \"%d\" [ label=\"pid %d, level %d\" ];\n", getpid(), getpid(), i + 1);
fprintf(file, " \"%d\" -> \"%d\";\n", getppid(), getpid());
}else{
fprintf(file, " \"%d\" [ label=\"pid %d, level %d\" ];\n", getpid(), getpid(), i + 1);
fprintf(file, " \"%d\" -> \"%d\";\n", getppid(), getpid());
}
}
else {
printf("parent: %d right child: %d\n", getpid(), pid_r);
pid_r = waitpid(-1, &status, 0);
break;
}
}

if (i == n) {
fprintf(file, "}");
fclose(file);
}

所以这里的方法 - 你需要fork两次,立即从左边的子节点返回,继续作为新的父节点在右边。

有关更改的更多说明:

  • 您的所有 fprintf() 调用中都有一个额外的参数。只需删除最后一个 file 参数即可。关于该主题有很多警告。
  • 您没有正确填写点文件中的最后一个括号 - 将 (i > n) 替换为 i == n

通过使用重新设计的循环,输出如下所示:

enter image description here

这看起来更像你想要的。

关于c - 使用 fork() 显示进程树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60182754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com